У нас есть приложение Nginx+Ruby, в котором данные между Nginx и приложением передаются через сокет.
В рамках улучшения производительности, когда мы проанализировали нетстат
статистика на стороне приложения мы видели такие:
5334 пакета удалены из очереди приема из-за переполнения буфера сокета
2299951 пакетов свернуты в очередь приема из-за низкого буфера сокета
227365 отправленных подтверждений с задержкой
Предполагая ремем
буферная емкость - это проблема, которую мы обнаруживаем:
$ sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096 87380 6291456
Однако, глядя на кошка /proc/net/протоколы
:
размер протокола сокеты память пресса maxhdr slab модуль cl co diac io in de sh ss gs se re sp bi br ha uh gp em
PINGv6 1120 0 -1 NI 0 да ipv6 y y n n y n n y y y n y y y y n
RAWv6 1120 0 -1 NI 0 да ipv6 y y y n y y n y y y n y y y n n
UDPLITEv6 1280 0 3 NI 0 да ipv6 y y n y y n y y y n n n y y n
UDPv6 1280 0 3 NI 0 да ipv6 y y y n y y n y y y n n n y y n
TCPv6 2152 4 52 нет 256 да ipv6 y y y y y y y y y y y n y y y y y
ПАКЕТ 1408 0 -1 NI 0 нет ядра n n n n n n n n n n n n n n n n n
UNIX 1024 24 -1 NI 0 да ядро n n n n n n n n n n n n n n n n n
UDP-Lite 1088 0 3 NI 0 да ядро y y y n y y n y y y y n n y y n
PING 912 0 -1 NI 0 да ядро y y y n n y n n y y y n y y y y n
RAW 920 0 -1 NI 0 да ядро y y y n y y n y y y n y y y n n
UDP 1088 4 3 NI 0 да ядро y y y n y y n y y y y n n y y n
TCP 1992 209 52 нет 256 да ядро y y y y y y y y y y y n y y y y
NETLINK 1048 0–1 NI 0 нет ядра n n n n n n n n n n n n n n n n n n
Мы видим, что нет давление памяти
.
Мы хотели бы получить несколько советов по следующим вопросам:
- Как мы можем узнать, действительно ли буфер был переполнен? Можем ли мы узнать, каков был выделенный размер буфера в течение определенного периода времени? Или какой был максимальный размер буфера? Если фактический максимальный размер буфера составлял 6 МБ, мы можем предположить, что буфер был переполнен.
- Если буфер был переполнен, почему
давление памяти
флаг не установлен? Есть ли давление памяти
флаг означает, что система не смогла выделить минимум
размер буфера?
- Делать
переполнение буфера
и пакет рушится
всегда означает, что размер буфера сокета был недостаточным?
Спасибо.