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