Socket accept - “Too many open files”

后端 未结 13 1932
情歌与酒
情歌与酒 2020-11-28 02:48

I am working on a school project where I had to write a multi-threaded server, and now I am comparing it to apache by running some tests against it. I am using autobench to

13条回答
  •  时光说笑
    2020-11-28 03:09

    For future reference, I ran into a similar problem; I was creating too many file descriptors (FDs) by creating too many files and sockets (on Unix OSs, everything is a FD). My solution was to increase FDs at runtime with setrlimit().

    First I got the FD limits, with the following code:

    // This goes somewhere in your code
    struct rlimit rlim;
    
    if (getrlimit(RLIMIT_NOFILE, &rlim) == 0) {
        std::cout << "Soft limit: " << rlim.rlim_cur << std::endl;
        std::cout << "Hard limit: " << rlim.rlim_max << std::endl;
    } else {
        std::cout << "Unable to get file descriptor limits" << std::endl;
    }
    

    After running getrlimit(), I could confirm that on my system, the soft limit is 256 FDs, and the hard limit is infinite FDs (this is different depending on your distro and specs). Since I was creating > 300 FDs between files and sockets, my code was crashing.

    In my case I couldn't decrease the number of FDs, so I decided to increase the FD soft limit instead, with this code:

    // This goes somewhere in your code
    struct rlimit rlim;
    
    rlim.rlim_cur = NEW_SOFT_LIMIT;
    rlim.rlim_max = NEW_HARD_LIMIT;
    
    if (setrlimit(RLIMIT_NOFILE, &rlim) == -1) {
        std::cout << "Unable to set file descriptor limits" << std::endl;
    }
    

    Note that you can also get the number of FDs that you are using, and the source of these FDs, with this code.

    Also you can find more information on gettrlimit() and setrlimit() here and here.

提交回复
热议问题