URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 92568
[ Назад ]

Исходное сообщение
"FreeBSD и много сокетов со статусом CLOSED. Как побороть?"

Отправлено Victor , 08-Ноя-11 15:32 
Прошу прощения за возможно нелепый вопрос. Но такая ситуация:
пробую писать маленькое приложение, принимающее соединения по tcp, для проверки на него отсылаю данные из другой программки. Все работает хорошо, за исключением одного момента:
после каждого сеанса связи остаются соединения со статусом CLOSED. И их с каждям разом становится больше.

# netstat -na | grep 1900 | grep CLOSED | head
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38508       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38503       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38496       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38484       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38479       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38474       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38466       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38461       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38456       CLOSED
tcp4       0      0 172.30.0.1.1900        172.30.0.1.38447       CLOSED
# netstat -na | grep 1900 | grep CLOSED | wc -l
     249

В связи с чем у меня вопросы:
1. Что мне нужно подправить в программах, чтобы эти сокеты быстрее исчезали из вывода netstat ?
2. Есть ли какой-нибудь sysctl, который позволит убирать такие соединения побыстрее (может, таймаут какой существует на присутсвие таких сокетов)?


Содержание

Сообщения в этом обсуждении
"FreeBSD и много сокетов со статусом CLOSED. Как побороть?"
Отправлено cryo , 08-Ноя-11 20:58 
Прям в соседней теме на опеннете:

---
TIME_WAIT

После того как соединение закрывается сокет переходит в состояние TIME_WAIT
В этом состоянии он может находится по умолчанию в течение 60 секунд.
Время можно изменить через sysctl (в миллисекундах деленных на 2, 2 x 30000 MSL = 60 секунд):

sysctl net.inet.tcp.msl=30000
---

см. http://www.opennet.me/base/net/tune_freebsd.txt.html


Поставь секунд 5-10 - сразу полегчает.


"FreeBSD и много сокетов со статусом CLOSED. Как побороть?"
Отправлено Victor , 09-Ноя-11 09:43 
> см. http://www.opennet.me/base/net/tune_freebsd.txt.html
> Поставь секунд 5-10 - сразу полегчает.

Поставил
sysctl net.inet.tcp.msl=3000

не полегчало :)

Пошел искать дальше, нарыл ссылку на http://www.ibm.com/developerworks/systems/library/es-nweb/in..., посмотрел там код и добавил себе закрытие сокетов после fork() в новом и родительском потоках:


if((fd = accept(sockfd, (struct sockaddr *) &sa, &n)) != -1) {
/* принимаем соединение */
  if(!fork()) { /* обрабатываем в новом потоке */
    (void)close(sockfd); // добавил по примеру из ibm
    operate(fd, sadr);
  }
  else {
    (void)close(fd); // добавил по примеру из ibm
  }
}


Полегчало сильно - больше таких сокетов не висит совсем.

Спасибо за помощь.