Среда: Ubuntu 10.04 LTS, Passenger, Nginx 1.0.6, MySQL, Ruby 1.9.2, Rails 3.1
По прошествии некоторого времени на сервере появляется постепенно увеличивающееся количество процессов, которые зависают на 100% ЦП.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2393 avitus 20 0 496m 381m 1392 R 100 9.4 25:10.74 Rack: /home/web ...
Запуск strace на любом из застрявших PID дает следующее:
Process 2393 attached with 3 threads - interrupt to quit
[pid 2396] futex(0x8ca80e4, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
[pid 2394] restart_syscall(<... resuming interrupted call ...>) = -1 ETIMEDOUT (Connection timed out)
[pid 2394] gettimeofday({1322590778, 346573}, NULL) = 0
[pid 2394] futex(0x821db60, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 2394] clock_gettime(CLOCK_REALTIME, {1322590778, 346885177}) = 0
[pid 2394] futex(0x821db84, FUTEX_WAIT_PRIVATE, 33872659, {0, 9687823}) = -1 ETIMEDOUT (Connection timed out)
[pid 2394] gettimeofday({1322590778, 356921}, NULL) = 0
[pid 2394] futex(0x821db60, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 2394] clock_gettime(CLOCK_REALTIME, {1322590778, 357196244}) = 0
[pid 2394] futex(0x821db84, FUTEX_WAIT_PRIVATE, 33872661, {0, 9724756}) = -1 ETIMEDOUT (Connection timed out)
[pid 2394] gettimeofday({1322590778, 367240}, NULL) = 0
[pid 2394] futex(0x821db60, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 2394] clock_gettime(CLOCK_REALTIME, {1322590778, 367459723}) = 0
[pid 2394] futex(0x821db84, FUTEX_WAIT_PRIVATE, 33872663, {0, 9780277}) = -1 ETIMEDOUT (Connection timed out)
[pid 2394] gettimeofday({1322590778, 377586}, NULL) = 0
[pid 2394] futex(0x821db60, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 2394] clock_gettime(CLOCK_REALTIME, {1322590778, 377807840}) = 0
[pid 2394] futex(0x821db84, FUTEX_WAIT_PRIVATE, 33872665, {0, 9778160}) = -1 ETIMEDOUT (Connection timed out)
[pid 2394] gettimeofday({1322590778, 387932}, NULL) = 0
[pid 2394] futex(0x821db60, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 2394] clock_gettime(CLOCK_REALTIME, {1322590778, 388162450}) = 0
[pid 2394] futex(0x821db84, FUTEX_WAIT_PRIVATE, 33872667, {0, 9769550}) = -1 ETIMEDOUT (Connection timed out)
Включение флага 'c' для strace дает:
Process 2393 attached with 3 threads - interrupt to quit
Process 2393 detached Process 2394 detached
Process 2396 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
94.97 0.003172 2 1489 744 futex
3.74 0.000125 0 745 clock_gettime
1.29 0.000043 0 745 gettimeofday
0.00 0.000000 0 1 1 restart_syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.003340 2980 745 total
Я могу убить -9 застрявшие процессы, и приложение и сервер, кажется, продолжают работать счастливо. У меня закончились идеи о том, как продолжить отладку, поэтому, если у кого-то есть совет относительно причины или других способов расследования, было бы здорово услышать.
Попробуйте установить для пассажира_spawn_method значение conservative в Passenger. У меня проблема с Mongo, и я наткнулся на:
http://code.google.com/p/phusion-passenger/issues/detail?id=684
и:
https://github.com/rails/rails/issues/1339
Я не знаю, почему это не работает, но, надеюсь, это поможет вам, если вы еще не нашли решение.
попробуйте выполнить следующую команду на своем сервере
sudo date -s "`date`"
Это конкретное поведение (проверка фьютекса каждые 20 мс, а затем проверка времени дня) кажется нормальным поведением для простаивающего процесса Ruby: