Коллеги, всем привет. Может кто знает или сможет направить.
Имеется 12.0-STABLE r343098 , сетевая ixl X710 10G
На машине в джейле живет сервис long-polling, который обслуживает от 300 до 500 тыс HTTP-соединений (как на вход, так и на выход, это сервер-прокси).
Джейлу присвоено множество серых IP, nginx при проксировании делает proxy_bind к этим IP по заданному алгоритму, вобщем перегрузки по отдельно каждому IP нет по исходящим портам (это для устранения проблемы с нестатком исходящих портов на машине).
Собственно сервис работает, если используется bind() вызов для установки соединения с этого джейла наружу.
Проблема в том, что если не делать bind() , то соединения исходящие не работают.
Как выглядит:
telnet
ya.ru 80
Trying
87.250.250.242...
telnet: connect to address
87.250.250.242: Can't assign requested address
Но если указать bind первого же IP у джейла - все ок
telnet -s
10.10.30.76 ya.ru 80
Trying
87.250.250.242...
Connected to
YA.ru.
Escape character is '^]'.
Смотря под truss, вызов connect() выполняется за дичайшее время 260+мс, если не выполнять bind()
0.273159720 connect(3,{ AF_INET
87.250.250.242:80 },16) ERR#49 'Can't assign requested address'
telnet: 0.000031149 write(2,"telnet: ",8) = 8 (0x8)
Если выполнять bind() то все шикарно и быстро
0.000024584 bind(3,{ AF_INET
10.10.30.76:0 },16) = 0 (0x0)
0.000161753 connect(3,{ AF_INET
10.10.10.90:80 },16) = 0 (0x0)
Есть ли известные проблемы с выбором исходящего IP/порта, байндингом, работой в джейле при большом кол-ве установленных соединений?
(п.с. проблема начинает проявляться при большом кол-ве соединений, )
procstat -kk на процесс в момент попытки установки соединения
PID TID COMM TDNAME KSTACK
28437 101677 telnet - in_pcb_lport+0x1d4 in_pcbbind_setup+0x1f6 in_pcbbind+0x58 tcp_connect+0x1e8 tcp_usr_connect+0xc4 soconnect+0xad kern_connectat+0x106 sys_connect+0x77 amd64_syscall+0x352 fast_syscall_common+0x101