Назад | Перейти на главную страницу

Веб-сайт убивает ввод-вывод жесткого диска, как предотвратить?

Ситуация: у меня есть сервер, на котором у нас 2-3 проекта. Не так давно сервер запустился повесить трубку (Мы не могли подключиться к нему по ssh, и подключенным клиентам пришлось ждать 20 минут, пока top не выдаст результаты)

Сегодня рано утром мне удалось выполнить gstat пока он был в этом состоянии и увидел, что он остается на 100% на da0, da0s1 и da0s1f. Я не совсем понимаю, что означают эти идентификаторы, но я понимаю, что некоторые процессы просто убивают HD, бомбардируя его запросами.

Я прошу некоторых предложений. Я не знаю, как найти виновного, и не могу этого предотвратить.

У меня на сервере есть freebsd.

Если ваша версия FreeBSD относительно современная, top имеет -m вариант, который показывает верхние участники ввода / вывода, если вы поставите его с "io"параметр:

top -m io

В этом случае я бы также использовал -S вариант (чтобы показать системные процессы, если один из них виноват). Чтобы лучше себя вести под нагрузкой, я бы использовал -q (чтобы заставить его работать с более высоким приоритетом), и -u (пропустить чтение /etc/passwd, что должно помочь ему загружаться быстрее).

Поскольку бегать так долго top, Я бы сказал, чтобы он отображал только два прохода вывода (-d 2), а затем запустить в пакетном режиме (-b), поэтому он автоматически выйдет.

В первый момент, когда ты бежишь top таким образом, его первая часть вывода будет показывать совокупное количество операций ввода-вывода для ряда процессов довольно далеко назад (может быть, с момента загрузки? Я на самом деле не уверен в этом). На первом экране вы можете увидеть, кто из вас больше всего болтал с течением времени. На втором экране вы можете увидеть самых активных участников разговора за последние две секунды.

Итак, собрав все вместе и запустив find так что происходит фактический ввод-вывод:

# top -S -m io -qu -b -d 2 10
last pid: 39560;  load averages:  0.28,  0.19,  0.08  up 6+04:02:29    11:28:28
125 processes: 2 running, 104 sleeping, 19 waiting

Mem: 96M Active, 668M Inact, 122M Wired, 25M Cache, 104M Buf, 17M Free
Swap: 2048M Total, 96K Used, 2048M Free


  PID    UID     VCSW  IVCSW   READ  WRITE  FAULT  TOTAL PERCENT COMMAND
   11      0        0 81032823      0      0      0      0   0.00% idle: cpu0
39554    105   129857 556534  74894      0      0  74894  13.62% find
39533    105   443603 614796      0      0      0      0   0.00% sshd
   36      0   1793393      0      0      0      0      0   0.00% irq23: vr0
   24      0   2377710   2680      0      0      0      0   0.00% irq20: atapci0
   50      0   533513 3415672     66 345350      0 345416  62.81% syncer
   13      0   78651569   7230      0      0      0      0   0.00% swi4: clock sio
    5      0   1911601  20905      0      0      0      0   0.00% g_down
    4      0   2368511  12100      0      0      0      0   0.00% g_up
   37      0    53308    313      0      0      0      0   0.00% acpi_thermal

last pid: 39560;  load averages:  0.28,  0.19,  0.08  up 6+04:02:31    11:28:30
125 processes: 2 running, 104 sleeping, 19 waiting
CPU:  1.9% user,  0.0% nice,  6.0% system,  2.2% interrupt, 89.9% idle
Mem: 96M Active, 671M Inact, 123M Wired, 25M Cache, 104M Buf, 14M Free
Swap: 2048M Total, 96K Used, 2048M Free

  PID    UID     VCSW  IVCSW   READ  WRITE  FAULT  TOTAL PERCENT COMMAND
   11      0        0   1115      0      0      0      0   0.00% idle: cpu0
39554    105      606    651    501      0      0    501 100.00% find
39533    105      616    695      0      0      0      0   0.00% sshd
   36      0     1251      0      0      0      0      0   0.00% irq23: vr0
   24      0      501     20      0      0      0      0   0.00% irq20: atapci0
   50      0        2      2      0      0      0      0   0.00% syncer
   13      0      313      3      0      0      0      0   0.00% swi4: clock sio
    5      0      501     26      0      0      0      0   0.00% g_down
    4      0      501      8      0      0      0      0   0.00% g_up
   37      0        0      0      0      0      0      0   0.00% acpi_thermal

Как только вы сузите, какой процесс выполняет весь ввод-вывод, вы можете использовать truss или devel/strace или sysutils/lsof порты, чтобы увидеть, что делают ваши ресурсоемкие процессы. (если ваша система очень загружена, конечно, вы не сможете легко установить порты):

Например, чтобы увидеть, какие файлы и другие ресурсы у меня ntpd процесс использует:

# lsof -p 890
ntpd        890   root  cwd     VDIR       0,93       1024        2 /
ntpd        890   root  rtd     VDIR       0,93       1024        2 /
ntpd        890   root  txt     VREG       0,98     340940   894988 /usr/sbin/ntpd
ntpd        890   root  txt     VREG       0,93     189184    37058 /libexec/ld-elf.so.1
ntpd        890   root  txt     VREG       0,93      92788    25126 /lib/libm.so.5
ntpd        890   root  txt     VREG       0,93      60060    25130 /lib/libmd.so.4
ntpd        890   root  txt     VREG       0,98      16604   730227 /usr/lib/librt.so.1
ntpd        890   root  txt     VREG       0,93    1423460    25098 /lib/libcrypto.so.5
ntpd        890   root  txt     VREG       0,93    1068216    24811 /lib/libc.so.7
ntpd        890   root    0u    VCHR       0,29        0t0       29 /dev/null
ntpd        890   root    1u    VCHR       0,29        0t0       29 /dev/null
ntpd        890   root    2u    VCHR       0,29        0t0       29 /dev/null
ntpd        890   root    3u    unix 0xc46da680        0t0          ->0xc4595820
ntpd        890   root    5u    PIPE 0xc4465244          0          ->0xc446518c
ntpd        890   root   20u    IPv4 0xc4599190        0t0      UDP *:ntp
ntpd        890   root   21u    IPv6 0xc4599180        0t0      UDP *:ntp
ntpd        890   root   22u    IPv4 0xc4599400        0t0      UDP heffalump.prv.tycho.org:ntp
ntpd        890   root   23u    IPv4 0xc4599220        0t0      UDP ns0.prv.tycho.org:ntp
ntpd        890   root   24u    IPv4 0xc45995c0        0t0      UDP imap.prv.tycho.org:ntp
ntpd        890   root   25u    IPv6 0xc4599530        0t0      UDP [fe80:4::1]:ntp
ntpd        890   root   26u    IPv6 0xc45993b0        0t0      UDP localhost:ntp
ntpd        890   root   27u    IPv4 0xc4599160        0t0      UDP localhost:ntp
ntpd        890   root   28u     rte 0xc42939b0        0t0

... и какие системные вызовы он делает (обратите внимание, что это может быть ресурсоемким):

# truss -p 890
SIGNAL 17 (SIGSTOP)
select(29,{20 21 22 23 24 25 26 27 28},0x0,0x0,0x0) ERR#4 'Interrupted system call'
SIGNAL 14 (SIGALRM)
sigreturn(0xbfbfea10,0xe,0x10003,0xbfbfea10,0x0,0x806aed0) ERR#4 'Interrupted system call'
select(29,{20 21 22 23 24 25 26 27 28},0x0,0x0,0x0) ERR#4 'Interrupted system call'
SIGNAL 14 (SIGALRM)
sigreturn(0xbfbfea10,0xe,0x10003,0xbfbfea10,0x0,0x806aed0) ERR#4 'Interrupted system call'
select(29,{20 21 22 23 24 25 26 27 28},0x0,0x0,0x0) ERR#4 'Interrupted system call'
SIGNAL 14 (SIGALRM)
sigreturn(0xbfbfea10,0xe,0x10003,0xbfbfea10,0x0,0x806aed0) ERR#4 'Interrupted system call'
^C

sysutils/strace похоже на truss, но вам понадобится /proc файловая система смонтирована:

# strace -p 890
strace: open("/proc/...", ...): No such file or directory
trouble opening proc file

# grep ^proc /etc/fstab
proc            /proc                           procfs          rw,noauto       0       0

# mount /proc

# mount | grep /proc
procfs on /proc (procfs, local)

... и тогда он будет работать:

# strace -p 890
Process 890 attached - interrupt to quit
--- SIGALRM (Alarm clock: 14) ---
--- SIGALRM (Alarm clock: 14) ---
syscall_417(0xbfbfea10)                 = -1 (errno 4)
select(29, [?], NULL, NULL, NULL)       = -1 EINTR (Interrupted system call)
--- SIGALRM (Alarm clock: 14) ---
--- SIGALRM (Alarm clock: 14) ---
syscall_417(0xbfbfea10)                 = -1 (errno 4)
select(29, [?], NULL, NULL, NULL^C <unfinished ...>
Process 890 detached

Удачи - дайте нам знать, что вы обнаружите! Как только вы определите процесс (ы), я смогу вам помочь.

РЕДАКТИРОВАТЬ: Обратите внимание, что бег lsof , truss и strace сами могут быть интенсивными. Я сделал несколько незначительных обновлений, чтобы уменьшить их влияние. Кроме того, если процесс быстро рождает много детей, вам, возможно, придется сказать truss или strace следить за дочерними процессами с помощью -f аргумент.

Через некоторое время я нашел настоящая проблема. Как я думал в последнем комментарии, это проблема нехватки памяти.

Виновником был ZEO сервер для ZODB. Он очень полагался на кеш ввода-вывода системного диска, и это приводило к обратным результатам, когда свободной памяти было меньше 500 МБ он начал замедляться и продолжаться 300 МБ он просто так много использовал диск, что система перестала отвечать, и даже некоторые службы начали отказывать (например, sshd).

После изменения структуры кеша и освобождения до 2 ГБ свободной памяти проблема устранена.