Skip site navigation (1)Skip section navigation (2)
Date:      Mon,  3 Jul 2000 02:36:15 -0700 (PDT)
From:      wyb@lodesoft.com
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   i386/19662: kernel panic after too many socket freed
Message-ID:  <20000703093615.7F84137B8BA@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         19662
>Category:       i386
>Synopsis:       kernel panic after too many socket freed
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jul 03 02:40:03 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     Ru Feng
>Release:        4.0-STABLE  snapshot 20000625
>Organization:
LodeSoft, Inc.
>Environment:
FreeBSD 4.0-STABLE #27: Mon Jul  3 15:01:58 CST 2000     wyb@lodesoft.com:/usr/src/sys/compile/MINE  i386

on 

Dell PowerEdge 2400/667 
Pentium III 667 x 2, 512M, 9G SCSI HD
network card : fxp0 + xl0

kernel config :
maxusers        256
options         SOFTUPDATES
options         NMBCLUSTERS=90000

in /etc/rc.local :
sysctl -w kern.maxfiles=65500
sysctl -w kern.maxfilesperproc=60000
sysctl -w net.inet.ip.portrange.last=65500


>Description:
I create a program to test how many connection can freebsd accepted,
it runs upto 32000 connections simultaneity. but when the program finished, the system crashed(or after a while). the error was :

panic : malloc : wrong bucket

(sometimes another message happened, e.g. 'trap 12' or 'cpu0: boot()')
>How-To-Repeat:
// compile and run this program : "./so & ./so c"
// notice you must update NMBCLUSTERS and kern.maxfilesperproc 
// at first :

(compile kernel with NMBCLUSTERS > 65000, install, reboot )
sysctl -w kern.maxfiles=65500
sysctl -w kern.maxfilesperproc=60000
sysctl -w net.inet.ip.portrange.last=65000
sysctl -w net.inet.ip.portrange.hifirst=65001

/*
    prog : Test Socket Max (so.c)
    usage :
    
    $ cc -o so so.c
    $ ./so & ./so c

    function address_end_point() from idonix.
*/

#define MAX_CONN    32000
#define HOST        "127.0.0.1"
#define PORT        "65510"

//#include <prelude.h>
#   include <fcntl.h>
#   include <netdb.h>
#   include <unistd.h>
#   include <dirent.h>
#   include <sys/types.h>
#   include <sys/param.h>
#   include <sys/socket.h>
#   include <sys/time.h>
#   include <sys/stat.h>
#   include <sys/ioctl.h>
#   include <sys/file.h>
#   include <sys/wait.h>
#   include <netinet/in.h>              /*  Must come before arpa/inet.h     */
#   include <arpa/inet.h>


int address_end_point (const char *host, const char *service, 
    const char *protocol, struct sockaddr_in *sin)
{
    struct hostent *phe; 
    struct servent *pse;
    int feedback = 0;

    memset ((void *) sin, 0, sizeof (*sin));
    sin-> sin_family = AF_INET;

    /*  Map service name to a port number                                    */
    pse = getservbyname (service, protocol);
    if (pse)
        sin-> sin_port = htons ((short) (ntohs (pse-> s_port)));
    else
        sin-> sin_port = htons ((short) (atoi (service)));

    /*  Check if it's a valid IP address first                               */
    sin-> sin_addr.s_addr = inet_addr (host);
    if (sin-> sin_addr.s_addr == INADDR_NONE)
      {
        /*  Not a dotted address -- try to translate the name                */
        phe = gethostbyname (host);
        if (phe)
            memcpy ((void *) &sin-> sin_addr, phe-> h_addr, phe-> h_length);
        else
          {                             /*  Cannot map to host               */
            feedback = (int) -1;
          }
      }
    return (feedback);
}



int lis;

void client_link()
{
    int i, r;
    int sd;
    char buf[100];
    
	struct sockaddr_in sin;
	r = address_end_point(HOST, PORT, "tcp", &sin);
    
    for (i = 0; i < MAX_CONN; i ++) {
        sd = socket(AF_INET, SOCK_STREAM, 0);
        printf("<%d:%d>\n", i, sd);
        if (sd < 0) {
            puts("ERROR connect()");
            exit(3);
        }

        r = connect(sd, (struct sockaddr *)&sin, sizeof(sin));
        
        write(sd, "H", 1);
        r = read(sd, buf, sizeof(buf));
        if (r != 1) {
            puts("ERROR read()");
            exit(2);
        }
    }
}

void server_link()
{
    int i, r;
    int sd;
    char buf[100];
	struct sockaddr_in sin;
	int len = sizeof(sin);
    
    for (i = 0; i < MAX_CONN; i ++) {
        sd = accept(lis, (struct sockaddr *)&sin, &len);
        printf("<%d:%d>\n", i, sd);
        if (sd < 0 ) 
            puts("ERROR accept()");

        r = read(sd, buf, sizeof(buf));
        if (r <= 0) puts("ERROR read()");
        write(sd, buf, r);
    }
}

int main(int argc, char** argv)
{
    int r;
    int is_client = (argc == 2 && *argv[1] == 'c');

	struct sockaddr_in sin;
    
    printf("Test Socket Max on %s [%s]\n", 
        "Front", is_client?"c->s":"s->c");
    if (is_client) {
        client_link();
    }
    else {
    	r = address_end_point(HOST, PORT, "tcp", &sin);
    	lis = socket(AF_INET, SOCK_STREAM, 0);
    	r = bind(lis, (struct sockaddr *)&sin, sizeof(sin));
        r = listen(lis, 5);
        server_link();
    }
    puts("Over.");

    return 0;
}


>Fix:
limit the connections in 4096.

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000703093615.7F84137B8BA>