Автор Тема: Помощ за оптимизация на сървър  (Прочетена 9046 пъти)

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Здравейте,

бих искал да ви помоля ако може да ми помогнете да оптимизирам възможно най-добре един сървър. На него е инсталиран CentOS 5 и на него имаме работещи apache 2 и mysql. Сайтът, който се хоства на него използва Innodb engine за таблиците в базата данни.

Проблемът е следният,

apache процесите използват повече процесор и load avarage от top скача нагоре. Необходимо ми е да оптимизирам системата да ползва по-малко процесор, защотот сайтът и системата стават бавни. Ето какво показва топ:

Примерен код

top - 23:11:41 up 11:24,  6 users,  load average: 2.04, 2.08, 2.06
Tasks: 130 total,   1 running, 129 sleeping,   0 stopped,   0 zombie
Cpu(s): 34.3%us,  6.8%sy,  0.0%ni, 52.1%id,  6.8%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4051316k total,  3745052k used,   306264k free,   151096k buffers
Swap:  6291448k total,    69640k used,  6221808k free,  1701868k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                
19301 mysql     15   0 2185m 531m 4424 S    2 13.4   0:42.53 mysqld                                                                                                                
 2174 root      19   0 1347m 440m 8960 S    0 11.1   5:32.76 java                                                                                                                  
19551 apache    15   0  435m 110m  41m S    0  2.8   0:30.54 httpd                                                                                                                  
19554 apache    15   0  411m  85m  41m S    0  2.2   0:37.34 httpd                                                                                                                  
19587 apache    15   0  412m  84m  40m S    0  2.1   0:42.91 httpd                                                                                                                  
19568 apache    16   0  409m  83m  41m D   82  2.1   0:29.80 httpd                                                                                                                  
19569 apache    15   0  408m  83m  41m S    0  2.1   0:49.39 httpd                                                                                                                  
19589 apache    15   0  409m  82m  40m S    0  2.1   0:17.50 httpd                                                                                                                  
19559 apache    15   0  409m  82m  40m S    0  2.1   0:34.86 httpd                                                                                                                  
19578 apache    15   0  409m  81m  40m S    0  2.1   0:34.18 httpd                                                                                                                  
19553 apache    15   0  407m  80m  40m S    0  2.0   0:08.89 httpd                                                                                                                  
19588 apache    15   0  406m  79m  40m S    0  2.0   0:13.91 httpd                                                                                                                  
19552 apache    15   0  405m  79m  40m S    0  2.0   0:27.38 httpd                                                                                                                  
19627 apache    15   0  403m  77m  41m S    0  2.0   0:09.87 httpd                                                                                                                  
19563 apache    15   0  404m  77m  41m S    0  2.0   0:34.15 httpd                                                                                                                  
19571 apache    15   0  399m  74m  42m S    0  1.9   0:11.61 httpd                                                                                                                  
19561 apache    15   0  398m  72m  42m S    0  1.8   0:45.43 httpd                                                                                                                  
19550 apache    15   0  398m  72m  40m S    0  1.8   0:13.68 httpd                                                                                                                  
19586 apache    15   0  399m  71m  40m S    0  1.8   0:30.43 httpd                                                                                                                  
19567 apache    15   0  399m  71m  40m S    0  1.8   0:31.72 httpd                                                                                                                  
19570 apache    15   0  396m  71m  41m S    0  1.8   0:16.42 httpd                                                                                                                  
19626 apache    15   0  396m  70m  40m S    0  1.8   0:18.85 httpd                                                                                                                  
 2474 mailman   18   0  186m  47m 3164 S    0  1.2   0:10.98 python                                                                                                                
 2472 mailman   18   0  184m  46m 3148 S    0  1.2   0:06.39 python                                                                                                                
 2477 mailman   15   0  183m  45m 3156 S    0  1.2   0:10.07 python                                                                                                                
 2476 mailman   15   0  180m  42m 3220 S    0  1.1   0:04.82 python                                                                                                                
18784 root      18   0  383m  26m 9008 S    0  0.7   0:00.54 httpd                                                                                                                  
19508 root      15   0 47980  16m 1832 S    0  0.4   0:01.47 awstats.pl                                                                                                            
 2475 mailman   18   0  147m 9860 3092 S    0  0.2   0:01.50 python                                                                                                                
 2473 mailman   18   0  147m 9824 3092 S    0  0.2   0:01.37 python                                    


Това е резултат от dstats

Примерен код

 76  21   1   0   0   0| 2.2  2.1  2.1|1847M  147M 1662M  300M|8087B   34k|  2   0   0|  68M 6076M|1055   805
 49   9  42   1   0   0| 2.1  2.1  2.1|1847M  147M 1662M  300M|5231B   41k|  2   0   0|  68M 6076M|1075  2139
----total-cpu-usage---- ---load-avg--- ------memory-usage----- -net/total- ---procs--- -swp/total- ---system--
usr sys idl wai hiq siq| 1m   5m  15m | used  buff  cach  free| recv  send|run blk new| used  free| int   csw
 22   6  72   1   0   0| 2.1  2.1  2.1|1847M  147M 1662M  300M|4303B   19k|  1   0   0|  68M 6076M|1074   953
  0   0 100   0   0   0| 2.1  2.1  2.1|1847M  147M 1662M  300M|2094B   19k|  1   0   0|  68M 6076M|1024   131
 33   9  55   3   0   0| 2.1  2.1  2.1|1848M  147M 1662M  299M|3208B   19k|  3   0   0|  68M 6076M|1062   863
 83  16   0   0   0   0| 2.1  2.1  2.1|1852M  147M 1662M  295M|4198B   20k|  8   0   0|  68M 6076M|1049  1320
 89  12   0   0   0   0| 2.3  2.1  2.1|1855M  147M 1662M  292M|3577B   21k|  6   0   0|  68M 6076M|1060  2542
 80  20   0   0   0   1| 2.3  2.1  2.1|1853M  147M 1662M  294M|4650B   53k|  3   0   0|  68M 6076M|1067  2618
 38  11  51   1   0   0| 2.3  2.1  2.1|1848M  147M 1662M  299M|9861B   76k|  4   0   0|  68M 6076M|1103   709
 82  17   2   0   0   0| 2.3  2.1  2.1|1852M  147M 1662M  295M|4569B   30k|  3   0   0|  68M 6076M|1085  1581
 57  14  29   0   0   0| 2.3  2.1  2.1|1853M  147M 1662M  294M|5086B   34k|  3   0   0|  68M 6076M|1061  2051
 60  11  29   1   0   0| 2.2  2.1  2.1|1846M  148M 1662M  301M|6029B   50k|  2   0   0|  68M 6076M|1173  1377
 50  12  37   0   0   0| 2.2  2.1  2.1|1846M  148M 1662M  301M|7440B   58k|  2   0   0|  68M 6076M|1067  1785
 12   3  84   1   0   0| 2.2  2.1  2.1|1847M  148M 1662M  299M|6211B   67k|  0   0   0|  68M 6076M|1092   463
 18   5  74   1   0   0| 2.2  2.1  2.1|1848M  148M 1662M  299M|5356B   27k|  0   0   0|  68M 6076M|1082   810
  0   1 100   0   0   0| 2.2  2.1  2.1|1847M  148M 1662M  299M|6042B   70k|  0   0   0|  68M 6076M|1085   227
  2   2  97   0   0   0|   2  2.1  2.1|1847M  148M 1662M  299M|6088B   53k|  2   0   0|  68M 6076M|1076   348
 39  10  49   2   0   0|   2  2.1  2.1|1848M  148M 1662M  299M|8597B   51k|  1   0   0|  68M 6076M|1082   742
 44   6  50   0   0   0|   2  2.1  2.1|1848M  148M 1662M  299M|7495B   68k|  1   0   0|  68M 6076M|1071  1449
 30   8  61   2   0   0|   2  2.1  2.1|1848M  148M 1662M  299M|4438B   42k|  0   2   0|  68M 6076M|1128  1226
 13   3  46  39   0   0|   2  2.1  2.1|1858M  148M 1662M  289M|8227B   37k|  1   0   0|  68M 6076M|1236   338


Имам следната конфигурация на apache:

Примерен код

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 100

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 2

##
## Server-Pool Size Regulation (MPM specific)
##

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers      5
MinSpareServers   5
MaxSpareServers   20
ServerLimit      100
MaxClients       100
MaxRequestsPerChild 4000
</IfModule>


И това е за my.cnf

Примерен код
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=0
bind-address=127.0.0.1
max_connections=300
# Set MyISAM parameters
key_buffer_size=3M
tmp_table_size=16M
# Set InnoDB parameters
innodb_file_per_table
# Set buffer pool size to 50 - 80% of availiable memory.
innodb_buffer_pool_size=1500M
innodb_additional_mem_pool_size=50M
# Set the log file size to about 25% of the buffer pool size.
#innodb_log_file_size=5M
#innodb_log_buffer_size=1M
table_cache=1024
#sort_buffer_size=3M
query_cache_type=1
query_cache_limit=1M
query_cache_size=40M
net_read_timeout=120
#long_query_time=10
#log_warnings=2
#log_slow_queries=/var/log/mysql/slow-queries.log
collation_server=utf8_unicode_ci
character_set_server=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


Моля ви се да ми помогнете да разреша този проблем.

Ако имате нужда от още информация ще ви я дам.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Помощ за оптимизация на сървър
« Отговор #1 -: May 20, 2008, 00:40 »
Reverse proxy, caching?
http://www.apachetutor.org/admin/reverseproxies
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Помощ за оптимизация на сървър
« Отговор #2 -: May 20, 2008, 01:24 »
Това ще реши от части проблемите, но целта е да я конфигурирам тази машина както трябва.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Помощ за оптимизация на сървър
« Отговор #3 -: May 20, 2008, 01:40 »
Струва ми се, че си дал прекалено много RAM на InnoDB:
innodb_buffer_pool_size=1500M

трябва да е малко над големината на ДБ таблиците.
Да не би Апачето да влиза в swap-a заради това?
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Помощ за оптимизация на сървър
« Отговор #4 -: May 20, 2008, 01:45 »
И провери какво ползваш за innodb_flush_method - трябва да е O_DIRECT.



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Помощ за оптимизация на сървър
« Отговор #5 -: May 20, 2008, 02:35 »
Благодаря ти за отговорите.

ами innodb_flush_method е този, който е default O_DSYNC();

Интересното е, че има свободна памет, но апачето продължава да ползва повече процесор. А какво виждам, ползването на swap е най-вероятно заради метода.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Помощ за оптимизация на сървър
« Отговор #6 -: May 20, 2008, 03:23 »
Ако не е тайна - какво се пуснато на сайта - т.е. каква система ползваш, език и т.н.?
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Помощ за оптимизация на сървър
« Отговор #7 -: May 20, 2008, 07:24 »
Не е тайна разбира се, ами ползваме ezpublish framework, на php е.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

teleport

  • Напреднали
  • *****
  • Публикации: 134
    • Профил
Помощ за оптимизация на сървър
« Отговор #8 -: May 20, 2008, 08:41 »
apache-то не ползва cpu, прави го php-то. Освен това "load average" е малко заблуждаващо: " The load average is the sum of the run queue length and the number of jobs currently running on the CPUs". Т.е. ако имаш едноядрен процесор load average >= 2 е зле, но ако имаш 4 ядрен процесор означава че 2 от ядрата в момента са свободни и нищо не правят.

За оптимизация на centos 5 първото нещо е да провериш дали irqbalance работи и ако не да го инсталираш/пуснеш: "yum -y install irqbalance; chkconfig irqbalance on; service irqbalance start". Тука има една тънкост. В Centos 5 irqbalance работи само ако имаш поне 2 ядра и ако ядрата имат отделен cache. Примерно на процесор "Intel® Core™2 CPU 4300 @ 1.80GHz" irqbalance директно прекратява работа защото двете ядра са с общ cache.

Проблем също може да е iowait.  6.8% не е много, но е достатъчно да за вкарва apache процес в dead състояние.

Според top най-много процесор ползва "java": 5 и половина часа от общ uptime 11 часа. Не съм запознат с ezpublish и дали ползва java-та, но определено java-та ползва най-много ресурси в случая.

В изискванията на ezpublish не пише нищо за java, така че явно във вашия случай се ползва за нещо друго.
Активен

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Помощ за оптимизация на сървър
« Отговор #9 -: May 20, 2008, 09:45 »
Здравей, благодаря за отговора.

Проверих, irqbalance е инсталиран и стартиран.

Ето това е информацията за процесора:

/proc/cpuinfo

Цитат

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 35
model name      : Dual Core AMD Opteron™ Processor 175
stepping        : 2
cpu MHz         : 2210.220
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3d
now pni lahf_lm cmp_legacy
bogomips        : 4421.69
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 35
model name      : Dual Core AMD Opteron™ Processor 175
stepping        : 2
cpu MHz         : 2210.220
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_
legacy
bogomips        : 4419.77
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp


Java та се ползва от един сървис наречен solr. Използваме го за индексиране, но обикновено той се стратира всеки час за около 5 мин и спира.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Помощ за оптимизация на сървър
« Отговор #10 -: May 20, 2008, 11:13 »
memory sizing-a нещо не е като хората. Колко е memory_limit на PHP? java процеса с какъв heap size се вдига (-Xmx параметъра)? Защо apache процесите "изяждат" толкова много памет?
Активен

"Knowledge is power" - France is Bacon

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Помощ за оптимизация на сървър
« Отговор #11 -: May 20, 2008, 11:26 »
и аз забелязвам, че когота load avarage скача, свободната памет намаля, макар че има cached memory достатъчно.

memory_limit е 128M

така като гледам java-та не е зададена с параметъра за макс. памет.

За апаче процесите съм дал MaxRequestPerChild да е 4000
а MaxSpareServer го направих 50. Намалих даже малко паметта, която се ползва от mysql, но все още продължава да се получава същия ефект. И аз мисля, че апаче процесите не трябва да ползват толкова рам.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Помощ за оптимизация на сървър
« Отговор #12 -: May 20, 2008, 11:54 »
Ми то не се налага да ползва максималната памет. jvm-то обаче като го запалиш си malloc-ва това, указано като големина на heap-а. Като гледам му е оказано нещо около 1200-1300 мегабайта.

Машината има 4 гигабайта памет. Нека 2gb ти ги взема mysql-a, 400-500 ти ги ползва apache-a (предполагам форкнатите процеси си споделят голяма част от паметта, COW). Останалите процеси и ядрото примерно ядат още около 500 мегабайта (гледам има питонски процеси някакви). Общо това прави към 3 гб. Когато се вдигне твоят java процес с heap size=1.2gb, каквото там е имало pagecache/vfs cache се evict-ва, но въпреки всичко паметта не достига и затва по-"неизползваните" страници в паметта влизат в суоп-а.

load-а се вдига поради няколко причини в тази ситуация - първо имаш повече page faults и вадене на страници от суоп-а в паметта и обратно, което са си бавни дискови операции. От друга страна, "изхвърлената кеширана информация" води дотам че следващите дискови операции ще са свързани с повече disk I/O, съответно процесите ще бъдат за малко повече време в uninterruptable sleep и ерго в runqueue.

Затова ако можеш намали това разхищение. "кажи" на mysql-a да ползва по-малко памет, виж ако можеш да разкараш ненужни apache модули, намали heap size-a на джавата, ако има вариант оптимизирай по някакъв начин PHP кода. Или (например) сложи някоя допълнителна банка памет.

Въобще не е казано, че ако нещо може да ползва повече оперативна памет, то ще върви по-бързо. В общият случай е така, но в гранични случаи, когато РАМ-та попривърши и почнеш да влизаш леко в суоп-а, нещата са различни '<img'>
Активен

"Knowledge is power" - France is Bacon

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Помощ за оптимизация на сървър
« Отговор #13 -: May 20, 2008, 12:15 »
Да, мисля че си прав. Не бях обърнал внимание, че джавата си заделя толкова heap. Паметта за mysql го намалих и сега heap за него е 1500-1600 МБ. Това помогна от части, сега ще намаля и джавата.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Помощ за оптимизация на сървър
« Отговор #14 -: May 20, 2008, 13:43 »
Цитат (ferrari_m @ Май 20 2008,02:35)
ами innodb_flush_method е този, който е default O_DSYNC();

"Големите глави" казват да се използва O_DIRECT за да не се получава повторно и излишно кеширане от страна на ОС-а.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P