From owner-freebsd-hackers@FreeBSD.ORG Fri Feb 18 13:18:54 2005 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3662816A4CE for ; Fri, 18 Feb 2005 13:18:54 +0000 (GMT) Received: from hermes.hw.ru (hermes.hw.ru [80.68.240.91]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5596E43D2D for ; Fri, 18 Feb 2005 13:18:52 +0000 (GMT) (envelope-from myself@rojer.pp.ru) Received: from [80.68.243.98] (account rojer@rbc.ru HELO [80.68.243.98]) by hermes.hw.ru (CommuniGate Pro SMTP 4.1.8) with ESMTP-TLS id 72200286 for freebsd-hackers@freebsd.org; Fri, 18 Feb 2005 16:18:42 +0300 Message-ID: <4215EB31.8020107@rojer.pp.ru> Date: Fri, 18 Feb 2005 16:18:41 +0300 From: Deomid Ryabkov User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206) X-Accept-Language: en-us, en MIME-Version: 1.0 To: freebsd-hackers@freebsd.org Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms060204010106040602020300" Subject: occasional ECONNREFUSED when connect()ing. X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Feb 2005 13:18:54 -0000 This is a cryptographically signed message in MIME format. --------------ms060204010106040602020300 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I have a strange case of occasional refused connect()'s. The system is running 4.10-STABLE. This was originally reported by one of our developers. The test script he provided is a simple Perl script that repeatedly fetches an URL from Apache running on this same server. In the run of 2000 iterations, there are 5-10 random errors fetching the URL. After further investigation and digging, I uncovered the true cause of the error: connect() returning ECONNREFUSED. To see if this was somehow related to Apache, I wrote my own simple server that accept()'s a connection, read()'s what supposed to be request and write()'s a stereotypic reply, thus resembling an HTTP request/reply conversation. The number of sporadically occuring connect() errors has increased somewhat, maybe due to quicker turnaround of my stub-server. The question is - why do connections get refused at all? I can think of no valid reasons... here's the output of the client as i see it: ----------------------------- sample output of x.pl ----------------------------- 71590, http://localhost:8000/junk, 2000: starting. 59 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 127 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 213 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 259 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 363 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 402 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 416 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 690 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 703 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 754 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 947 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 960 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 997 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 1163 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 1272 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 1433 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 1612 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) 1887 500 Can't connect to localhost:8000 (Timeout connect: Connection refused) ----------------------------- cut ----------------------------- (the confusing "Timeout connect:" message is a result of my IO/Socket/INET.pm hacking. without it, just a confusing "Timeout" was reported. i added printing of actual error string.) a fragment of output of the same script running under strace: ----------------------------- strace of x.pl ----------------------------- socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 connect(3, {sa_family=AF_INET, sin_port=htons(8000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused) ----------------------------- cut ----------------------------- and the source of both server and client used: ----------------------------- accepter.c (server) ----------------------------- #include #include #include #include char *reply = "HTTP/1.0 200 OK\r\nConetnt-type: text/plain\r\n\r\nNothing special.\r\n"; int rlen; int main(int argc, char **argv) { int i, cal; int s, ss, n; char *buf; struct sockaddr_in saddr, caddr; memset(&saddr, 0, sizeof saddr); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(8000); ss = socket(PF_INET, SOCK_STREAM, 6); if (ss < 0) return 1; if (bind(ss, (struct sockaddr *) &saddr, sizeof saddr) < 0) return 2; if (listen(ss, 511) < 0) return 3; buf = (char *) malloc(4096); if (buf == NULL) return 4; rlen = strlen(reply); fprintf(stderr, "accepting.\n"); for (cal = sizeof caddr; s = accept(ss, (struct sockaddr *) &caddr, &cal); cal = sizeof caddr) { n = read(s, buf, 4096); if (n > 0) { write(s, reply, rlen); } close(s); } return (s < 0); } ----------------------------- cut ----------------------------- ----------------------------- x.pl (client) ----------------------------- #!/usr/bin/perl $| = 1; use LWP::UserAgent; $url = 'http://localhost:8000/junk'; my $n = 2000; print "$$, $url, $n: starting.\n"; for (my $i = 0; $i < $n; $i++) { my $ua = LWP::UserAgent->new; $ua->timeout(1000); $req = HTTP::Request->new("GET" => $url); $res = $ua->request($req); print $i." ".$res->status_line."\n" if (0 or $res->code == 500); } exit(); ----------------------------- cut ----------------------------- -- Deomid Ryabkov aka Rojer myself@rojer.pp.ru rojer@sysadmins.ru ICQ: 8025844 --------------ms060204010106040602020300 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIJIzCC AuwwggJVoAMCAQICAwwKdjANBgkqhkiG9w0BAQQFADBiMQswCQYDVQQGEwJaQTElMCMGA1UE ChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNv bmFsIEZyZWVtYWlsIElzc3VpbmcgQ0EwHhcNMDQwMzMxMjIxODA5WhcNMDUwMzMxMjIxODA5 WjBfMRAwDgYDVQQEEwdSeWFia292MQ8wDQYDVQQqEwZEZW9taWQxFzAVBgNVBAMTDkRlb21p ZCBSeWFia292MSEwHwYJKoZIhvcNAQkBFhJteXNlbGZAcm9qZXIucHAucnUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBxXgFP/1lZDqp0dzUDzR5IBb7aKki6TD+HMMkRjtP IOcaNHsfoDer9RFrFICoxNQZF86iopYFVYr7msgB9y2dKZTRQQoOA72lFrOyH3sgrztx/3LL axEsihA2cxcrglrIgPEm6FF2aabbKVpSdeslMCDPBr0auAm0QLo8ch9c5j0vuQUBrs8TKU6f 6YZLNO2Sk/fPZP2kfJEkXyZhkU6wq3ER1CHq2qgfNpW2Ni7Kuv/eYI/CV1BGgm37ZPubOyxI LNiRUGT0pv0wocrCIehKqoI1uFPZgGS0ANYTqPJQSdjlSzMGQJjT510PNDJnDfKOvLhcadD+ 6gSL/ovNM/LPAgMBAAGjLzAtMB0GA1UdEQQWMBSBEm15c2VsZkByb2plci5wcC5ydTAMBgNV HRMBAf8EAjAAMA0GCSqGSIb3DQEBBAUAA4GBACunC6DhFX4I6Nvdy/UevjSd3VmKWPRmqwoR l0RXvuI/JVyPO9KHGqxCMpRu7ArJz7d8ShPVs5kynysrB+Nm6/fwWjeaW21+gViojeO9gGP6 Np/LeMIqkqSYMoElq7Feqh/3qp7a/UxuofFtAW9V/2tRunxaPo4/WOxcdcmdcC86MIIC7DCC AlWgAwIBAgIDDAp2MA0GCSqGSIb3DQEBBAUAMGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxU aGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwg RnJlZW1haWwgSXNzdWluZyBDQTAeFw0wNDAzMzEyMjE4MDlaFw0wNTAzMzEyMjE4MDlaMF8x EDAOBgNVBAQTB1J5YWJrb3YxDzANBgNVBCoTBkRlb21pZDEXMBUGA1UEAxMORGVvbWlkIFJ5 YWJrb3YxITAfBgkqhkiG9w0BCQEWEm15c2VsZkByb2plci5wcC5ydTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMHFeAU//WVkOqnR3NQPNHkgFvtoqSLpMP4cwyRGO08g5xo0 ex+gN6v1EWsUgKjE1BkXzqKilgVVivuayAH3LZ0plNFBCg4DvaUWs7IfeyCvO3H/cstrESyK EDZzFyuCWsiA8SboUXZpptspWlJ16yUwIM8GvRq4CbRAujxyH1zmPS+5BQGuzxMpTp/phks0 7ZKT989k/aR8kSRfJmGRTrCrcRHUIeraqB82lbY2Lsq6/95gj8JXUEaCbftk+5s7LEgs2JFQ ZPSm/TChysIh6EqqgjW4U9mAZLQA1hOo8lBJ2OVLMwZAmNPnXQ80MmcN8o68uFxp0P7qBIv+ i80z8s8CAwEAAaMvMC0wHQYDVR0RBBYwFIESbXlzZWxmQHJvamVyLnBwLnJ1MAwGA1UdEwEB /wQCMAAwDQYJKoZIhvcNAQEEBQADgYEAK6cLoOEVfgjo293L9R6+NJ3dWYpY9GarChGXRFe+ 4j8lXI870ocarEIylG7sCsnPt3xKE9WzmTKfKysH42br9/BaN5pbbX6BWKiN472AY/o2n8t4 wiqSpJgygSWrsV6qH/eqntr9TG6h8W0Bb1X/a1G6fFo+jj9Y7Fx1yZ1wLzowggM/MIICqKAD AgECAgENMA0GCSqGSIb3DQEBBQUAMIHRMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVy biBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSQwIgYDVQQDExtU aGF3dGUgUGVyc29uYWwgRnJlZW1haWwgQ0ExKzApBgkqhkiG9w0BCQEWHHBlcnNvbmFsLWZy ZWVtYWlsQHRoYXd0ZS5jb20wHhcNMDMwNzE3MDAwMDAwWhcNMTMwNzE2MjM1OTU5WjBiMQsw CQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoG A1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIElzc3VpbmcgQ0EwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAMSmPFVzVftOucqZWh5owHUEcJ3f6f+jHuy9zfVb8hp2vX8MOmHy v1HOAdTlUAow1wJjWiyJFXCO3cnwK4Vaqj9xVsuvPAsH5/EfkTYkKhPPK9Xzgnc9A74r/rsY Pge/QIACZNenprufZdHFKlSFD0gEf6e20TxhBEAeZBlyYLf7AgMBAAGjgZQwgZEwEgYDVR0T AQH/BAgwBgEB/wIBADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLnRoYXd0ZS5jb20v VGhhd3RlUGVyc29uYWxGcmVlbWFpbENBLmNybDALBgNVHQ8EBAMCAQYwKQYDVR0RBCIwIKQe MBwxGjAYBgNVBAMTEVByaXZhdGVMYWJlbDItMTM4MA0GCSqGSIb3DQEBBQUAA4GBAEiM0VCD 6gsuzA2jZqxnD3+vrL7CF6FDlpSdf0whuPg2H6otnzYvwPQcUCCTcDz9reFhYsPZOhl+hLGZ GwDFGguCdJ4lUJRix9sncVcljd2pnDmOjCBPZV+V2vf3h9bGCE6u9uo05RAaWzVNd+NWIXiC 3CEZNd4ksdMdRv9dX2VPMYIDOzCCAzcCAQEwaTBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMc VGhhd3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFs IEZyZWVtYWlsIElzc3VpbmcgQ0ECAwwKdjAJBgUrDgMCGgUAoIIBpzAYBgkqhkiG9w0BCQMx CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0wNTAyMTgxMzE4NDFaMCMGCSqGSIb3DQEJ BDEWBBTVJ16792QuMz+W1C96FzL8pUVAlTBSBgkqhkiG9w0BCQ8xRTBDMAoGCCqGSIb3DQMH MA4GCCqGSIb3DQMCAgIAgDANBggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggqhkiG9w0DAgIB KDB4BgkrBgEEAYI3EAQxazBpMGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3dGUgQ29u c3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwg SXNzdWluZyBDQQIDDAp2MHoGCyqGSIb3DQEJEAILMWugaTBiMQswCQYDVQQGEwJaQTElMCMG A1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBl cnNvbmFsIEZyZWVtYWlsIElzc3VpbmcgQ0ECAwwKdjANBgkqhkiG9w0BAQEFAASCAQBS1kMy IXwcudfab1G40Tm2+h2eUOTMZb+xZwKW8JsLsfRZMGp6k222JDDlAxndCzCXCFNE8akBJDWP DtkjU+y7RYUvVr95/A99d+Vj7AWUJUQtEcut1SIXJkoyxNbQJ48aZ1hYZnaNCRALKNU23q2W lMykABBM0bYnNc+2vrmXM52jZ2sWcipgwSB941X5KvJzoLQxUYjWSEo6cDWSgf0OvzyaFe9S dRHpNvmZYg9F8aMPola/vLSVTWr/Tk+nKiGOHHReUjA+kk2knEJj+C/hCuH8yG3amempiye5 iMfeYqZzUSwTfvokeNvwzhDqV9RurlfE5Vq7754d0HauarW1AAAAAAAA --------------ms060204010106040602020300--