З'ясуйте, що насправді робить процес високоефективного використання процесора?


18

В даний час у нас є кілька проблем з нашим сервером, де ми, з перервами, здаємося, що ми отримуємо процеси apache, які просто запускаються і працюють, займаючи 100% процесор.

Під час руху зверху ми бачимо наступне:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20788 www-data  20   0  318m  18m 3984 R  100  0.0  40:29.21 /usr/sbin/apache2 -k start
23523 www-data  20   0  319m  20m 4684 R  100  0.0   4:12.36 /usr/sbin/apache2 -k start

Я хочу спробувати дізнатися, який сценарій (або що б там не було) викликає це, тому я спробував:

 strace -p 20788

Але це взагалі не показує жодного результату (я залишаю його близько 10 хвилин, і він нічого не показує). З мого розуміння, це може означати, що він застряг у нескінченному циклі, і немає жодних "системних дзвінків" для показу.

Чи можу я щось ще зробити, щоб показати, що відбувається?

Спасибі

Редагувати - забути згадати, це сервер в реальному часі з кількома сотнями користувачів у будь-який час! Тому я не можу просто вільно спробувати змінити параметри конфігурації та перезапустити apache.

Edit 2 - Backtrace (bt) від gdb, здається, не є тим корисним, коли PHP не налаштований на --enable-debug - він показує лише "Execute ()", але мені потрібно знати, що таке сценарій PHP насправді працює .. чи є інший спосіб?

#0  0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so
#1  0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so
#2  0x00007f6c1438b970 in zend_execute_scripts () from     /usr/lib/apache2/modules/libphp5.so
#3  0x00007f6c14337fe3 in php_execute_script () from     /usr/lib/apache2/modules/libphp5.so
#4  0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so
#5  0x00007f6c18912508 in ap_run_handler ()
#6  0x00007f6c1891297e in ap_invoke_handler ()
#7  0x00007f6c18922570 in ap_process_request ()
#8  0x00007f6c1891f398 in ?? ()
#9  0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()

1
Apache підтримує "витончений" перезапуск, так чому б вам не зробити це?
poige

1
Я думаю, що коли ми спробували це раніше, він не міг перезапуститись граціозно через «застряглі» апаш-процеси ... хоча це може бути неправильним, це було певний час тому.
BT643

Ще один трюк - запустити інший примірник apache на іншому порту, перенаправляючи до нього нові з'єднання.
poige

Відповіді:


9

Ну, якщо ви почуваєтесь сміливими:

gdb -p 20788

потім видайте, btщоб побачити рамку стека, наприклад,

І BTW, є ще ltraceзгадати - спробуйте також.

UPD. : ну добре, оскільки зараз у нас є думка, що Apache дійсно щось працює, чому б ти не подивився на mod_statusрезультат - Розширений ?


gdb не встановлено :( доведеться чекати, поки я повернусь до роботи завтра, щоб побачити, чи зможу я встановити його, не викликаючи жодних проблем. ltraceНе з'явився жоден вихід
BT643

Щойно додав результати з gdb bt у початковий пост .. насправді зовсім не дуже мені розповідає!
BT643

О, радий бачити, що я запропонував правильний напрямок. )
poige

@ BT643, див. UPD.
poige

4
Реалізований mod_status був уже включений за замовчуванням, він був лише обмежений для доступу з 127.0.0.1. Я щойно увійшов через SSH та передав висновок у файл curl domain.com/server-status > randomfile.html- потім переглянув файл. Виявилося, що старий код розробника застряг у циклі (PHP-файл)! Зараз усе відсортовано. Дякую за допомогу :)
BT643

2

Дуже простий підхід - це використання htop. Ви можете сортувати за процесами з високим процесором, а потім використовувати

  • s для straceпроцесу
  • l для того, lsofщоб побачити відкриті файли процесів
  • Л до ltrace.

Я виявив, що принаймні один із цих варіантів знаходить сценарій, що генерує навантаження, і ви, звичайно, можете використовувати це на виробничому веб-сервері для налагодження.


1

Ви можете спробувати:

  • iotop (показ вводу / виводу в системі)
  • netstat -t (показує з'єднання)
  • Погляньте на журнали апаш-файлів і з’ясуйте, що останній сервер зробив
  • встановити деякі RLimits для апаш-процесу. Коли ці межі будуть досягнуті, процес буде вбито, даючи вам більше інформації

0

Ваша команда повинна працювати, якщо ви зробите HTTP-запит, який запускає PID.

Можливо, ви хочете тимчасово повторно налаштувати Apache лише з одним дочірнім процесом?


Майте на увазі, що лише одна дочірня процедура означає, що Apache може обслуговувати лише один запит, і якщо ця єдина дитина застрягла, Apache не зможе обслуговувати жодних запитів.
Стефан Ласєвський

Не можу цього зробити, оскільки це живий сервер із сотнями одночасних користувачів (додали це в ОП, як раніше не було зрозуміло)
BT643

0

ПІД цього примірника апачі низький, він може бути батьком усього партії. Це, безумовно, пояснює високе використання процесора (він залишається навколо, інші створюються і відкликаються відповідно до навантаження). Багато накопиченого часу процесора може просто означати, що він працює давно. Немає результату strace(1)просто означає, що він не робив системних дзвінків. Так, це може бути в тісному циклі, але apache по суті є вводу-виводу через мережу, тому я думаю, що це не робить нічого корисного. Дивні 100% одного процесора, в будь-якому випадку.


Низький PID не обов'язково означає, що це старий процес. PID мають максимальне значення і обертаються, щоб нові процеси можна було створити, використовуючи низькі PID.
австрійський

0

Спробуйте це:

1) Запустіть журнал із датою / часом, сценарієм PHP та PID, використовуючи getmypid()

2) Потім перегляньте ваш сервер top

3) Коли ви бачите, що процес apache зростає, знайдіть ту саму дату / час та PID у своїх журналах. Ви повинні мати можливість знайти проблемний сценарій.


Це цікаве рішення, але я бачу, що він забирає більше ресурсів, ніж це варто, враховуючи, що він mod_statusробить свою роботу досить добре.
австрійський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.