- 论坛徽章:
- 0
|
问题是这样子的,接到一个任务,我需要编写一个程序模拟客户端到服务器的请求,从而测试服务器的性能;
大致思路是,每次启动一个进程,这个进程就会向服务器发起很多连接(通过命令行获取数目),用一个类来封装每一个连接,每个连接类都会有自己的读写线程,
现在问题是,每次启动时,设置的连接数目最多只能是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开发,很多不懂,有地方没有描述清楚,请大家指出来,不甚感激 |
|