Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

Что показывает netstat -Lan

 

06.06.2004

Во FreeBSD команда netstat -Lan показывает размеры очередей на слушающих портах. До версии 4.1-STABLE эта команда выводит примерно следующее:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address        
40/38/3000     *.80                  
0/0/5          *.22                  
В этом примере максимальный размер очереди на 80-ом порту — 3000 соединений. Это размер задаётся параметром backlog в вызове listen(2) и не может быть больше, чем задано в sysctl kern.ipc.somaxconn. На самом деле, максимальный размер всегда больше указанного в полтора раза, то есть, в данном случае это 4500 соединений. В очереди присутствует 40 соединений, из которых только два готовы для accept(2), а остальные 38 находятся в состоянии установления соединения (например, получен SYN от клиента).

Во FreeBSD 4.1-STABLE появились accept-фильтры и это отразилось на выводе netstat -Lan. Если слушающий порт использует accept-фильтр, то установленное соединение, не прошедшее фильтр, остаётся в очереди как неготовое. Если к предыдущим 40 соединениям в нашем примере добавить 50 соединений, не прошедших фильтр, то netstat -Lan покажет следующее:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address        
90/89/3000     *.80                  
0/0/5          *.22                  
Обратите внимание, что из двух готовых соединений из первого примера фильтр прошло только одно. Вы спросите, где же находятся 50 не прошедших фильтр соединений в первом примере ? Ответ — они уже приняты сервером, часть из них может быть уже даже давно закрыта. Дело в том, что в современных accept-фильтрах (dataready и httpready) не предусмотрены никакие таймауты и соединение может находиться в очереди несколько часов, пока не будет удалено по истечении keepalive-таймаута в TCP (если он включён).

Во FreeBSD 4.4-STABLE появились syncache и syncookie, и в очереди остались только установленные соединения. Если accept-фильтр не используется, то наш пример выглядит так:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address        
2/0/3000       *.80                  
0/0/5          *.22                  
а с использованием accept-фильтра — вот так:
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address        
1/51/3000      *.80                  
0/0/5          *.22                  
Таким образом, в современных версиях FreeBSD qlen показывает число соединений, готовых для accept(), а incqlen — число принятых, но не прошедших фильтр, соединений.

(C) Игорь Сысоев
http://sysoev.ru