ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: accept() failed (53: Software caused connection abort)



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 mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.