linux进程能打开的最大套接字数目
问题是这样子的,接到一个任务,我需要编写一个程序模拟客户端到服务器的请求,从而测试服务器的性能;
大致思路是,每次启动一个进程,这个进程就会向服务器发起很多连接(通过命令行获取数目),用一个类来封装每一个连接,每个连接类都会有自己的读写线程,
现在问题是,每次启动时,设置的连接数目最多只能是62个,我指定是要开启100个连接
int main(int argc, char* argv[])
{
/* ParseArgs(argc, argv);*/
char szServerIP[16] = {0};
short nPort = -1;
int nConnNumber = -1;
int nTestType = -1;
int ch;
while((ch = getopt(argc, argv, "s:p:m:t:")) != -1)
{
switch(ch)
{
case 's':
{
strcpy(szServerIP, optarg);
break;
}
case 'p':
{
nPort = atoi(optarg);
if(nPort < 1024)
{
LOG_1("invalid port, port=%d", nPort);
}
break;
}
case 'm'://这里指定最大连接数,我启动时给的值是100
{
nConnNumber = atoi(optarg);
if (nConnNumber < 0)
{
LOG_1("invalid connect number, m=%d", nConnNumber);
}
break;
}
case 't':
{
nTestType = atoi(optarg);
if (nTestType < 0)
{
nTestType = -1;
LOG_1("invalid test type , nTestType=%d", nTestType);
}
break;
}
default:
{
Usage();
return 0;
}
}
}
if(strlen(szServerIP) == 0)
strcpy(szServerIP, "127.0.0.1");
if (nPort <= 0)
nPort = 9528;
if(nConnNumber <= 0)
nConnNumber = 1;
g_nMaxConnCount = nConnNumber;
for (int i = 0; i < nConnNumber; i++)
{
CConnectInstance* pConnInstance = new CConnectInstance(i + 1, nTestType);
pConnInstance->SetServerAddr(szServerIP, nPort);
pConnInstance->ConnectToServer();
}
while(1);
return 0;
}
复制代码
每次需要启动100个连接,都只会停在62个,就停止向服务器发起新的连接了
我按照网上方法做了很多配置修改:
-----第一种方法-------------------------------------------------
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪个用户的打开文件数限制,可用'*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
[speng@as4 ~]$ cat /proc/sys/fs/file-max
12158
---------第二种方法-----------------------------------------------------------
sysctl net.ipv4.tcp_max_syn_backlog=40960
sysctl net.core.netdev_max_backlog=40960
sysctl net.core.somaxconn=40960
sysctl net.ipv4.tcp_window_scaling=0
sysctl net.ipv4.ip_local_port_range="10000 61000"
ulimit -n80000
ulimit -c1000000000
----------------------------------------------------------------
修改之后都重启了,并且关闭了防火墙,还是不行,注意我修改都是服务器机器和客户端机器同时修改配置
然后,我自己写了一个简单的服务器程序,当这个服务器程序和客户端运行在同一台linux机器上时,不会出现这个问题,但是把这个简单服务器移到另外一台机器上,就出现了上述同样的问题;
希望各位给出一点建议,这个问题到底需要怎么解决?????初次接触linux开发,很多不懂,有地方没有描述清楚,请大家指出来,不甚感激 linux? socket
[解决办法]
是不是你的局域网有限制?问问网管
[解决办法]
你可以先检查下服务端机器看是否内存耗尽,然后抓下包看是客户端没发还是服务端问题。