В настоящее время у меня высокая загрузка ЦП на сервере, на котором работает всего пара сайтов с очень низким трафиком. Один из сайтов находится в стадии разработки и скоро будет запущен. Однако этот сайт работает очень-очень медленно ... Просматривая его страницы, я вижу, что загрузка ЦП для httpd изменяется с 30% до 100% (см. Верхний результат ниже).
Я настроил httpd и MySQL, Apache Solr, Tomcat для обеспечения высокой производительности и использую APC.
Не уверен, что делать отсюда или как найти виновника, поскольку у меня есть куча сообщений в журнале httpd, и я уже какое-то время искал тупики ... любая помощь приветствуется.
Сервер: AuthenticAMD, четырехъядерный процессор AMD Opteron (tm) 2352, ОЗУ 16 ГБ
Linux 2.6.27 64-разрядная, Centos 5.5
Plesk 9.5.4, MySQL 5.1.48, PHP 5.2.17
Apache / 2.2.3 (CentOS) DAV / 2 mod_jk / 1.2.15 mod_ssl / 2.2.3 OpenSSL / 0.9.8e-fips-rhel5 PHP / 5.2.17 mod_perl / 2.0.4 Perl / v5.8.8
Tomcat6-6.0.29-1.jpp5, Tomcat-native-1.1.20-1.el5, Apache Solr
верхняя
17595 apache 20 0 1825m 507m 10m R 100.4 3.2 0:17.50 httpd
17596 apache 20 0 1565m 247m 9936 R 83.1 1.5 0:10.86 httpd
17598 apache 20 0 1430m 110m 6472 S 54.5 0.7 0:08.66 httpd
17599 apache 20 0 1438m 124m 12m S 37.2 0.8 0:11.20 httpd
16197 mysql 20 0 13.0g 2.0g 5440 S 9.6 12.6 297:12.79 mysqld
17617 root 20 0 12748 1172 812 R 0.7 0.0 0:00.88 top
8169 tomcat 20 0 4613m 268m 6056 S 0.3 1.7 6:40.56 java
httpd error_log
[debug] prefork.c(991): AcceptMutex: sysvsem (default: sysvsem)
[info] mod_fcgid: Process manager 17593 started
[debug] proxy_util.c(1854): proxy: grabbed scoreboard slot 0 in child 17594 for worker proxy:reverse
[debug] proxy_util.c(1967): proxy: initialized single connection worker 0 in child 17594 for (*)
[debug] proxy_util.c(1854): proxy: grabbed scoreboard slot 0 in child 17595 for worker proxy:reverse
[debug] proxy_util.c(1873): proxy: worker proxy:reverse already initialized
[notice] child pid 22782 exit signal Segmentation fault (11)
[error] (43)Identifier removed: apr_global_mutex_lock(jk_log_lock) failed
[debug] util_ldap.c(2021): LDAP merging Shared Cache conf: shm=0x7fd29a5478c0 rmm=0x7fd29a547918 for VHOST: example.com
[info] APR LDAP: Built with OpenLDAP LDAP SDK
[info] LDAP: SSL support available
[info] Init: Seeding PRNG with 256 bytes of entropy
[info] Init: Generating temporary RSA private keys (512/1024 bits)
[info] Init: Generating temporary DH parameters (512/1024 bits)
[debug] ssl_scache_shmcb.c(374): shmcb_init allocated 512000 bytes of shared memory
[debug] ssl_scache_shmcb.c(554): entered shmcb_init_memory()
[debug] ssl_scache_shmcb.c(576): for 512000 bytes, recommending 4265 indexes
[debug] ssl_scache_shmcb.c(619): shmcb_init_memory choices follow
[debug] ssl_scache_shmcb.c(621): division_mask = 0x1F
[debug] ssl_scache_shmcb.c(623): division_offset = 96
[debug] ssl_scache_shmcb.c(625): division_size = 15997
[debug] ssl_scache_shmcb.c(627): queue_size = 2136
[debug] ssl_scache_shmcb.c(629): index_num = 133
[debug] ssl_scache_shmcb.c(631): index_offset = 8
[debug] ssl_scache_shmcb.c(633): index_size = 16
[debug] ssl_scache_shmcb.c(635): cache_data_offset = 8
[debug] ssl_scache_shmcb.c(637): cache_data_size = 13853
[debug] ssl_scache_shmcb.c(650): leaving shmcb_init_memory()
Попробуйте добавить% P (и% D) в файлы журнала - тогда вы сможете сопоставить то, что вы видите в «верху», с журналом доступа.
Я вижу в списке mod_perl. Этот сайт - приложение, написанное на PERL? Если так, то в основе проблемы будет плохо написанный код PERL.
Тот же комментарий относится к PHP. Приложения PHP не отличаются производительностью, а приложения CMS имеют репутацию ресурсоемких приложений. Если вы являетесь хостинг-провайдером, лучше всего либо запретить этот пакет CMS, либо взимать более высокую плату, чтобы покрыть дополнительные ресурсы.
Но если вы используете эту CMS для собственного использования, поскольку она имеет открытый исходный код, вам следует опубликовать еще один вопрос в StackOverflow, назвав пакет и спросив, как отследить и исправить плохо написанный код.
[уведомление] дочерний pid 22782 сигнал выхода Segmentation fault (11)
Здесь точно что-то не так, следует добавить ulimit -c unlimited
к началу /etc/init.d/httpd
чтобы получить дамп ядра в следующий раз, когда он завершится с ошибкой segfault. Вероятно, в корне проблемы лежит mod_jk, поскольку в журнале есть ошибка, связанная с mod_jk.
Я больше не видел ошибки segmentation fault, но я все еще вижу высокую загрузку процессора, исходящую от httpd. Мне удалось запустить strace в процессе httpd с помощью процессора, и я получил следующее:
# strace -c -p 28964
Process 28964 attached - interrupt to quit
^CProcess 28964 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
88.94 0.006093 0 98299 4562 lstat
3.01 0.000206 0 2740 getcwd
2.28 0.000156 0 2158 2 read
2.26 0.000155 0 541 37 open
1.68 0.000115 0 1321 1321 readlink
1.52 0.000104 0 1678 822 access
0.32 0.000022 0 502 fstat
0.00 0.000000 0 25 write
0.00 0.000000 0 507 close
0.00 0.000000 0 547 478 stat
0.00 0.000000 0 23 poll
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 2 rt_sigprocmask
0.00 0.000000 0 2 writev
0.00 0.000000 0 3 setitimer
0.00 0.000000 0 1 sendfile
...
------ ----------- ----------- --------- --------- ----------------
100.00 0.006851 108381 7224 total
Ошибки 4562 из lstat являются ошибками того же типа и отображаются в файле журнала следующим образом:
# strace -f -t -o /var/log/strace.output -p 28964
strace.output
28964 07:10:38 lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=94, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites", {st_mode=S_IFDIR|0755, st_size=30, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all", {st_mode=S_IFDIR|0755, st_size=66, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules/views", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules/views/includes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules/views/includes/sites", 0x7fff1e627370) = -1 ENOENT (No such file or directory)
Все перечисленные выше папки находятся в каталоге этого веб-сайта и являются частью Drupal CMS. Однако последний в списке
/var/www/vhosts/example.com/httpdocs/sites/all/modules/views/includes/sites
не существует, и это действительно должно быть
/var/www/vhosts/example.com/httpdocs/sites
который действительно существует. Похоже, lstat пытается прочитать несуществующий каталог ....?
-1 ENOENT (No such file or directory)
Как лучше всего решить эту проблему и найти источник этой ошибки для отсутствующего каталога?