question about fopen fd limit

Ian Smith smithi at nimnet.asn.au
Thu Dec 22 15:15:09 UTC 2016


In freebsd-questions Digest, Vol 655, Issue 4, Message: 10
On Thu, 22 Dec 2016 11:53:08 +0800 ??? <hhsheng at corp.netease.com> wrote:
 > hi all,
 > 
 >    hi~
 >    we are from Chinese Game Develop Corp, Netease.
 >    and One of our product using FreeBsd as its OS platform.
 >    This Game has Millions of players online , and Each Server may 
 > holds 25000+ tcp connection at the same time.Thanks to BSD and kqueue 
 > :)
 > 
 >    for example, it's one of our server , netstat cmd to list 
 > connections overall...
 >    netstat -an | grep 13396 (it's our listening port) | wc -l
 >    23221
 > 
 >     recently we do some performance optimize and promote this connect 
 > limit to 28000+ or 30000+.
 >   But we find Freebsd has a limit that this huge online number will 
 > take 28000+ fd, and bsd FILE * struct's fd only support to SHORT . 
 > such as ..
 > 
 > struct __sFILE {
 >  ...
 >  short _file; /* (*) fileno, if Unix descriptor, else -1 */
 >  ...
 > 
 >   so if our server want to fopen some file when we still hold this 
 > online number, the fd amount may easily exceed 32767, and fopen 
 > definitely return a err code. then the server will appear some fataly 
 > ERROR.
 > 
 >   we do a simple test and confirm this situation.
 > 
 >   then in fopen's code , we notice that we can use open to return a 
 > fd instread of fopen to avoid this overflow, as below
 > 
 > 68 /* 
 > 1 * File descriptors are a full int, but _file is only a short. 
 > 2 * If we get a valid file descriptor that is greater than 
 > 3 * SHRT_MAX, then the fd will get sign-extended into an 
 > 4 * invalid file descriptor. Handle this case by failing the 
 > 5 * open. 
 > 6 */
 > 
 > 
 >   BUT ... so many c lib FILE series function needs a FILE * pointer 
 > as input argument, we can't convert all of them to fd, or it will be 
 > a rather suffering things to us.
 > 
 >   and even in BSD 10 , it seems this short limit still there , but 
 > other OS as debian , FILE strucnt's fileno is a int .
 >   
 >   we found an unoffical patch easily change this fileno to unsigned , 
 > but we are a very stready project, we can't afford the risk to use an 
 > unoffical patch.
 > 
 >   so, do you have any plan to change this fopen fd limit to UNSIGNED 
 > SHORT or int in the future ? ushort is enough for us .
 >   if you do , we are really glad and excited~~~~~~~if you don't ,it 
 > donen't matter, plz give us a reply so that we may need to
 >   find some other plan to resolved this suffering thing.
 >   LoL, thank you !!!!!
 > 
 > yours sincerely
 >                                        winson sheng

If you do not get a useful response here, I recommend reposting this to 
freebsd-net at freebsd.org where it will much more likely catch the eye of 
people who work with network code.

cheers, Ian


More information about the freebsd-questions mailing list