accept() failed (53: Software caused connection abort)
Sergey Budnevitch
sb на waeme.net
Пт Май 4 07:44:10 UTC 2012
On 02.05.2012, at 20:26, Anton Yuzhaninov wrote:
> Есть несколько однотипных серверов с nginx.
> На одном из них в 10 раз больше сообщений
> accept() failed (53: Software caused connection abort)
> чем на других.
> Выяснить чем он отличается от других пока не получается.
>
> Вопрос - можно ли как то такие соединения отфильтровать из дампа трафика, чтобы на них посмотреть?
Если там freebsd и доступен dtrace, то можно попробовать зайти с другой стороны: выяснить адрес и порт,
и по ним в дампе найти то, что хочется.
accept возвращается с ECONNABORTED в случае, если у соединения в backlog'е установлен
флаг SBS_CANTRCVMORE. Устанавливают его socantrcvmore(), soisdisconnected() и soisdisconnecting().
Нужно отловить, когда они вызываются с unaccepted сокетом в качестве аргумента и вытащить адрес и порт.
Скрипт будет примерно таким (выглядит немного запутанно, т.к. приходится реализовывать аналог getpeername):
#!/usr/sbin/dtrace -s
inline int SQ_INCOMP = 0x0800; /* unaccepted, incomplete connection */
inline int SQ_COMP = 0x1000; /* unaccepted, complete connection */
fbt::socantrcvmore_locked:entry / args[0]->so_qstate & (SQ_INCOMP|SQ_COMP) / {
family = args[0]->so_proto->pr_domain->dom_family;
sin_addr = &(((struct inpcb *)(args[0])->so_pcb)->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4);
sin_port = ((struct inpcb *)(args[0])->so_pcb)->inp_inc.inc_ie.ie_fport;
address = inet_ntop(family, (void *)sin_addr);
port = ntohs(sin_port);
printf("%-15s %-5d\n",address , port);
}
fbt::soisdisconnected:entry / args[0]->so_qstate & (SQ_INCOMP|SQ_COMP) / {
family = args[0]->so_proto->pr_domain->dom_family;
sin_addr = &(((struct inpcb *)(args[0])->so_pcb)->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4);
sin_port = ((struct inpcb *)(args[0])->so_pcb)->inp_inc.inc_ie.ie_fport;
address = inet_ntop(family, (void *)sin_addr);
port = ntohs(sin_port);
printf("%-15s %-5d\n",address , port);
}
fbt::soisdisconnecting:entry / args[0]->so_qstate & (SQ_INCOMP|SQ_COMP) / {
family = args[0]->so_proto->pr_domain->dom_family;
sin_addr = &(((struct inpcb *)(args[0])->so_pcb)->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4);
sin_port = ((struct inpcb *)(args[0])->so_pcb)->inp_inc.inc_ie.ie_fport;
address = inet_ntop(family, (void *)sin_addr);
port = ntohs(sin_port);
printf("%-15s %-5d\n",address , port);
}
Подробная информация о списке рассылки nginx-ru