Jamai
14/11/05, 11:17
Ik heb een server die nogal veel bezoekers heeft. Dagelijks zitten er 20.000 unieke bezoekers, wat natuurlijk nog niet veel is, maar de site bevat een (lightweight) forum en mensen kunnen elkaar berichten sturen. Soort van Fok!-achtige website in elk geval.
Op de piekuren zitten er 800 ingelogde mensen die bij elkaar duizendenpagina's bekijken; gemiddeld worden er 40 pagina's per bezoeker bekeken en dan kom je dus uit op dichtbij de miljoen dynamische (!) pageviews.
Nu heb ik me zitten verdiepen in manieren om de load wat omlaag te halen. De server zit geregeld tussen de 10-20 aan load, gelukkig wel nog 40% idle meestal dus alles wordt nog wel snel afgehandeld.
Ik draai met de nieuwste PHP5, de nieuwste Apache2 en de nieuwste MySQL 4. Natuurlijk wel allemaal de stabielste nieuwste versies ;)
Hardware: Dual Xeon 3.0 Ghz met hyperthreading, 2x 200 GB hardeschijven in (hardware) RAID1, 4 GB DDR2-geheugen
Ik vraag me op dit moment heel erg af of een 2e webserver installeren voor statische content een slim plan is. Op elke pagina staan wel 30-40 images. Ik hoorde dat TUX, khttpd, en thttpd hier goed in zijn. Iemand hier ervaringen mee?
Verder valt er waarschijnlijk aan Apache nog wel het 1 en ander te tweaken aan deze instellingen:
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3
<IfModule prefork.c>
ServerLimit 1152
StartServers 128
MinSpareServers 20
MaxSpareServers 40
MaxClients 1152
MaxRequestsPerChild 0
</IfModule>
Hoe kun je bepalen wat hier de beste instellingen zijn? MaxClients & ServerLimit zijn denk ik wel goed ingesteld, aangezien ik tijdens piekuren rond de 1050 clients waargenomen heb.
MySQL levert waarschijnlijk de grootste belasting. Alle queries zijn al geoptimized, heb hier ook uitgebreid mee getest en alles op de beste manieren staan nu (ook qua indexen, keys, en een aantal databases in InnoDB omdat die continue geupdate moeten worden).
De instellingen van MySQL heb ik niet zelf gemaakt, en heb hier dan ook grote twijfels over:
[mysqld]
set-variable=max_connections=1000
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 128M
max_allowed_packet = 16M
thread_stack = 128K
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache = 8
query_cache_limit = 1048576
query_cache_size = 32M
query_cache_type = 1
thread_concurrency = 8
skip-networking
skip-bdb
Voor het InnoDB gedeelte geldt hetzelfde:
innodb_buffer_pool_size = 768M
innodb_additional_mem_pool_size = 20M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
Voor de volledigheid de rest van my.cnf:
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
max_connections=2000
Hoe bepaal je dit soort waardes?
PHP is gecompileerd (ook al weer niet door mij) met de volgende modules:
core mod_access mod_auth mod_log_config mod_env mod_setenvif prefork http_core mod_mime mod_status mod_autoindex mod_asis mod_negotiation mod_dir mod_imap mod_actions mod_userdir mod_alias mod_so mod_include mod_cgi mod_speling mod_rewrite mod_php5
En Zend Optimizer heb ik er zelf opgezet in de hoop alles nog iets te versnellen.
Verder werk ik dus met sessies voor elke gebruiker die ingelogd zit. Valt hier op de één of andere manier nog een winst te boeken?
Op de piekuren zitten er 800 ingelogde mensen die bij elkaar duizendenpagina's bekijken; gemiddeld worden er 40 pagina's per bezoeker bekeken en dan kom je dus uit op dichtbij de miljoen dynamische (!) pageviews.
Nu heb ik me zitten verdiepen in manieren om de load wat omlaag te halen. De server zit geregeld tussen de 10-20 aan load, gelukkig wel nog 40% idle meestal dus alles wordt nog wel snel afgehandeld.
Ik draai met de nieuwste PHP5, de nieuwste Apache2 en de nieuwste MySQL 4. Natuurlijk wel allemaal de stabielste nieuwste versies ;)
Hardware: Dual Xeon 3.0 Ghz met hyperthreading, 2x 200 GB hardeschijven in (hardware) RAID1, 4 GB DDR2-geheugen
Ik vraag me op dit moment heel erg af of een 2e webserver installeren voor statische content een slim plan is. Op elke pagina staan wel 30-40 images. Ik hoorde dat TUX, khttpd, en thttpd hier goed in zijn. Iemand hier ervaringen mee?
Verder valt er waarschijnlijk aan Apache nog wel het 1 en ander te tweaken aan deze instellingen:
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3
<IfModule prefork.c>
ServerLimit 1152
StartServers 128
MinSpareServers 20
MaxSpareServers 40
MaxClients 1152
MaxRequestsPerChild 0
</IfModule>
Hoe kun je bepalen wat hier de beste instellingen zijn? MaxClients & ServerLimit zijn denk ik wel goed ingesteld, aangezien ik tijdens piekuren rond de 1050 clients waargenomen heb.
MySQL levert waarschijnlijk de grootste belasting. Alle queries zijn al geoptimized, heb hier ook uitgebreid mee getest en alles op de beste manieren staan nu (ook qua indexen, keys, en een aantal databases in InnoDB omdat die continue geupdate moeten worden).
De instellingen van MySQL heb ik niet zelf gemaakt, en heb hier dan ook grote twijfels over:
[mysqld]
set-variable=max_connections=1000
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 128M
max_allowed_packet = 16M
thread_stack = 128K
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache = 8
query_cache_limit = 1048576
query_cache_size = 32M
query_cache_type = 1
thread_concurrency = 8
skip-networking
skip-bdb
Voor het InnoDB gedeelte geldt hetzelfde:
innodb_buffer_pool_size = 768M
innodb_additional_mem_pool_size = 20M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
Voor de volledigheid de rest van my.cnf:
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
max_connections=2000
Hoe bepaal je dit soort waardes?
PHP is gecompileerd (ook al weer niet door mij) met de volgende modules:
core mod_access mod_auth mod_log_config mod_env mod_setenvif prefork http_core mod_mime mod_status mod_autoindex mod_asis mod_negotiation mod_dir mod_imap mod_actions mod_userdir mod_alias mod_so mod_include mod_cgi mod_speling mod_rewrite mod_php5
En Zend Optimizer heb ik er zelf opgezet in de hoop alles nog iets te versnellen.
Verder werk ik dus met sessies voor elke gebruiker die ingelogd zit. Valt hier op de één of andere manier nog een winst te boeken?