Strange Things
Не охота думать
В какой то момент было замеченно что переодически процессы httpd плодятся больше “заданного” количества например:
1
2
3
4
5
6
7
8
9
10
11
cat 10-worker.conf
<IfModule mpm_worker_module>
ServerLimit 100
StartServers 5
MinSpareThreads 250
MaxSpareThreads 750
ThreadLimit 256
MaxRequestWorkers 5000
ThreadsPerChild 125
#MaxConnectionsPerChild 2000
</IfModule>
Видимо что ServerLimit = 100, смотрим кол-во httpd процессов:
1
2
ps -ef|grep "/usr/sbin/httpd"|wc -l
574
Ну явно какая то херня. В нашем случае есть говно модуль от любимного oracle - mod_wl24.so
Находим какой нить подозрительный pid я для этого использовал следующую комманду:
1
2
3
4
5
6
7
8
9
ps -o pid,comm,user,thcount -u apache
...
32226 httpd apache 2
32239 httpd apache 2
32245 httpd apache 2
32402 httpd apache 2
32520 httpd apache 2
32680 httpd apache 2
...
видим прям овердохера процессов с 2мя потоками.. возникает вопрос что же они делают… тут нам пригодится gdb Берем любой подозрительный pid с 2мя потоками
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
gdb --pid=32680
...
#########################
# Смотрим потоки и видим тут подозрительный Thread 2 который определенно чего ждет
#########################
(gdb) info threads
Id Target Id Frame
2 Thread 0x7f96cb7d6700 (LWP 32276) "httpd" 0x00007f96f908e42d in __lll_lock_wait ()
from /lib64/libpthread.so.0
* 1 Thread 0x7f96fa7a3780 (LWP 32226) "httpd" 0x00007f96f9088f57 in pthread_join ()
from /lib64/libpthread.so.0
...
#########################
# Переключаемся на второй поток
#########################
(gdb) thread 2
[Switching to thread 2 (Thread 0x7f96cb7d6700 (LWP 32276))]
0 0x00007f96f908e42d in __lll_lock_wait () from /lib64/libpthread.so.0
#########################
# Смотрим подробнее backtrace
#########################
bt
#0 0x00007f96f908e42d in __lll_lock_wait () from /lib64/libpthread.so.0
#1 0x00007f96f9089dcb in _L_lock_812 () from /lib64/libpthread.so.0
#2 0x00007f96f9089c98 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3 0x00007f96ea82af4b in yodysMtxLock () from /lib64/libdms2.so
#4 0x00007f96ea8288e6 in yodSlotLock () from /lib64/libdms2.so
#5 0x00007f96ea827266 in yodStateIncrementSb8 () from /lib64/libdms2.so
#6 0x00007f96eb1a05ec in wl_increment_state_metric () from /usr/lib64/mod_wl_24.so
#7 0x00007f96eb19b981 in request_handler () from /usr/lib64/mod_wl_24.so
#8 0x00005566b7349760 in ap_run_handler ()
#9 0x00005566b7349ca9 in ap_invoke_handler ()
#10 0x00005566b736083a in ap_process_async_request ()
#11 0x00005566b7360b1e in ap_process_request ()
#12 0x00005566b735caad in ap_process_http_connection ()
#13 0x00005566b73538d0 in ap_run_process_connection ()
#14 0x00007f96f03edc9b in worker_thread () from /etc/httpd/modules/mod_mpm_worker.so
#15 0x00007f96f9087e25 in start_thread () from /lib64/libpthread.so.0
#16 0x00007f96f8bb134d in clone () from /lib64/libc.so.6
Из того что режет глаз 0x00007f96eb19b981 in request_handler () from /usr/lib64/mod_wl_24.so те собстенно mod_wl и его братья: 0x00007f96ea827266 in yodStateIncrementSb8 () from /lib64/libdms2.so
Можно конечно упороться дальше и поизучать mod_wl что же его так подташнивает… но проще его выпилить и перейти на найтивные средства проксирования httpd.
P.S Причем если смотреть метрики httpd выглядеть может все вполне нормально: