ping: sendto: No buffer space available

Если вы увидели такое сообщение на сервере, значит пришло время посмотреть и оценить сетевую нагрузку на сервер. Посмотреть текущее состояние буферов можно так:

# netstat -m
1026/2709/3735 mbufs in use (current/cache/total)
1024/1766/2790/132096 mbuf clusters in use (current/cache/total/max)
1024/768 mbuf+clusters out of packet secondary zone in use (current/cache)
0/802/802/66048 4k (page size) jumbo clusters in use (current/cache/total/max)
0/0/0/33024 9k jumbo clusters in use (current/cache/total/max)
0/0/0/16512 16k jumbo clusters in use (current/cache/total/max)
2304K/7417K/9721K bytes allocated to network (current/cache/total)
0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)
0/0/0 requests for jumbo clusters denied (4k/9k/16k)
0/0/0 sfbufs in use (current/peak/max)
0 requests for sfbufs denied
0 requests for sfbufs delayed
15 requests for I/O initiated by sendfile
0 calls to protocol drain routines

или

# vmstat -z | grep mbuf
mbuf_packet: 256, 0, 1024, 768, 9163111497, 0
mbuf: 256, 0, 2, 1941, 6166886673, 0
mbuf_cluster: 2048, 132096, 1792, 998, 14208, 0
mbuf_jumbo_page: 4096, 66048, 0, 802, 166262704, 0
mbuf_jumbo_9k: 9216, 33024, 0, 0, 0, 0
mbuf_jumbo_16k: 16384, 16512, 0, 0, 0, 0
mbuf_ext_refcnt: 4, 0, 0, 672, 11055, 0

Так же можно ещё посмотреть количество коллизий на интерфейсах:

# netstat -id

Если кратко объяснить, что оно такое: нехватка системных буферов для выполнения операций. Как правило такая проблема появляться на плохих сетевых карточках и не всегда зависит от большой нагрузки. К примеру, я наблюдал такую ситуацию, когда в кроне выставлен пинг (8 пакетов) на хост каждый 5 минут и за сутки появлялось такое сообщение на шлюзе, который обслуживает 20 человек с каналом загрузки до 10мбит.

Но что же сделать, что бы избавиться от этого раз и навсегда? Самый правильный способ — поставить хорошие сетевые карточки, например, Intel (igb). Второй вариант даёт результат с вероятностью 50%. Он представляет собой небольшой тюниг переменных системы и ядра. Опишу его ниже.

— увеличиваем количество nmbclusters и буферов:

echo 'kern.ipc.nmbclusters=524288' >> /boot/loader.conf
echo 'kern.ipc.maxsockbuf=1048576' >> /boot/loader.conf
echo 'hw.igb.rxd=4096' >> /boot/loader.conf
echo 'hw.igb.txd=4096' >> /boot/loader.conf

где igb — имя сетевой карты, на которой возникают проблемы (если у вас другая — замените соответственно на другое имя)

Примечание.

На 64-битных системах с большим объёмом памяти можно выставить значения kern.ipc.nmbclusters=1000000

— увеличиваем размер буфера

net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.sendbuf_inc=16384
net.inet.tcp.recvbuf_inc=524288

— увеличиваем количество пользователей и значение буферов

пересобираем ядро с такими параметрами

maxusers        512
options         NBUF=4096

Если вы используете netgraph, можно ещё увеличить такие значения:

net.graph.maxdgram=524288
net.graph.recvspace=524288

Если же после этого тюнинга продолжают появляться такие ошибки — попробуйте либо увеличить значения либо поставить всё же нормальную сетевую карточку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *