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 выглядеть может все вполне нормально:

img