Осиротілі зв’язки у стані CLOSE_WAIT


30

У мене є машина SLES, яка накопичує TCP-з'єднання в стані CLOSE_WAIT для того, що, здається, назавжди. Ці дескриптори врешті висмоктують усю наявну пам'ять. На даний момент у мене є 3037, але це було набагато вище перед останнім часом поспішного перезавантаження.

Що цікаво, це те, що вони не з’єднані з локальними портами, які, як я очікую, мають процеси прослуховування. У них немає пов'язаних PID, і їхні таймери, здається, закінчилися.

# netstat -ton | grep CLOSE_WAIT
tcp      176      0 10.0.0.60:54882     10.0.0.12:31663      CLOSE_WAIT  off (0.00/0/0)
tcp       54      0 10.0.0.60:60957     10.0.0.12:4503       CLOSE_WAIT  off (0.00/0/0)
tcp       89      0 10.0.0.60:50959     10.0.0.12:3518       CLOSE_WAIT  off (0.00/0/0)

# netstat -tonp | grep CLOSE_WAIT
tcp       89      0 10.0.0.59:45598     10.0.0.12:1998       CLOSE_WAIT  -                   
tcp       15      0 10.0.0.59:60861     10.0.0.12:1938       CLOSE_WAIT  -                   
tcp        5      0 10.0.0.59:56173     10.0.0.12:1700       CLOSE_WAIT  -     

Я не є чорним поясом, коли мова заходить про стек TCP або мережу ядра, але конфігурація TCP здається здоровою, оскільки ці значення за замовчуванням на сторінці man:

# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time 
7200

То що дає? Якщо терміни закінчилися, чи не повинен стек автоматично очищати цей матеріал? Я ефективно даю собі довгостроковий ДО, оскільки ці речі накопичуються.


О, і моє дослідження показує, що інші такі артефакти бачать у "lsof -i". Я там нічого дивного не бачу.
pboin

2
Спробуйте sudo netstat -tonpпобачити, з якою програмою це відбувається.
BillThor

1
Допомога та моя відповідь stackoverflow.com/a/17697733/540323 допоможуть.
Amil Waduwawara

Відповіді:


16

Ні, час очікування не існує CLOSE_WAIT. Я думаю, що це offозначає ваші результати.

Щоб вийти з програми CLOSE_WAIT, програма повинна явно закрити сокет (або вийти).

Дивіться, як зламати CLOSE_WAIT .

Якщо netstatвідображається -у стовпці процесу:

  • ти працюєш з відповідними привілеями та можливостями (наприклад, як root)?
  • вони можуть бути процесами ядра (наприклад, nfsd)

Роблячи нестати, у мене були повні приватні ігри, так. Я піду перевірити кут ядра процесів - це гарна ідея. Я дуже спотикався, тому що взагалі не повинно бути жодних прослуховувань, крім двох-трьох відомих привілейованих портів. Можливо, це проблема wierd iptables. Я теж це перевірю.
pboin

1
Посилання розірвано.
Натан


10

CLOSE_WAITвказує на те, що клієнт закриває з'єднання, але програма ще не закрила його, або клієнт ні. Ви повинні визначити, яка програма чи програми мають цю проблему. Спробуйте netstat -tonp 2>&1 | grep CLOSEвизначити, які програми містять з'єднання.

Якщо в списку немає програм, сервіс надається ядром. Ймовірно, це такі послуги RPC, як nfsабо rpc.lockd. Служби прослуховування ядра можуть бути перелічені за допомогою netstat -lntp 2>&1 | grep -- -.

Якщо служби RPC не прив’язані до фіксованих портів, вони прив'язуються до ефемерних портів, як видається, що показують ваші з'єднання. Ви також можете перевірити процеси та установки на іншому сервері.

Ви можете мати змогу прив’язати свої послуги NFS до фіксованих портів, виконавши наступні дії:

  1. Виберіть чотири невикористані порти для NFS (тут використовуються 32763-32766)
  2. Додайте фіксовані порти для NFS до /etc/services
    rpc.statd-bc 32763 / udp # RCP статична трансляція
    rpc.statd-bc 32763 / тсп
    rpc.statd 32764 / udp # RCP statd прослуховувати
    rpc.statd 32764 / тсп
    rpc.mountd 32765 / udp # RPC кріплення
    rpc.mountd 32765 / tcp
    rpc.lockd 32766 / udp # RPC замкнено / nlockmgr
    rpc.lockd 32766 / тсп
  3. Налаштуйте statd для використання параметрів --port 32763 --outgoing-port 32764
  4. Налаштуйте rpcmountd для використання параметра --port 32765
  5. Вимкнення та перезапуск послуг NFS та RPC.

Я написав, що PID не було, але не показав свою роботу. Я швидко змінив вашу пропозицію, дякую.
pboin

@opboin: додані коментарі до портів без PIDS (послуги ядра).
BillThor

3
CLOSE-WAIT означає, що одноранговий закрив свій кінець і локальна ОС чекає закриття локальної програми.
користувач207421
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.