TProactor的问题
要在solaris和windows下实现几千个并发数连接的服务端,Reactor看来是不行了,就转到Proactor上,在Windows下测试没有问题,在Solairs下运行占用CPU巨多,经常90%以上,查资料一看,原来Proactor模式,ACE封装的并不好,需要用TProactor来替代,从http://terabit.com.au/solutions.php下载代码,在Solaris9下编译测试程序P_Test(稍作修改,使之能长时间发送与接收数据),结果发现在Solairs9下最多只能接收250个连接,多了就不能接收了。以下是日志中的信息Apr 17 11:54:24.897 2007@LM_DEBUG@(27665|1) Starting P_Test test at Tue Apr 17 2007 11:54:24.897501
Apr 17 11:54:24.898 2007@LM_DEBUG@s_blksize=1024 r_blksize=2048 win_size=0
Apr 17 11:54:24.899 2007@LM_DEBUG@ALLOCATOR Chunk size=144
Apr 17 11:54:24.899 2007@LM_DEBUG@ALLOCATOR Chunk size=144
Apr 17 11:54:24.899 2007@LM_DEBUG@ALLOCATOR Chunk size=208
Apr 17 11:54:24.899 2007@LM_DEBUG@ALLOCATOR Chunk size=272
Apr 17 11:54:24.899 2007@LM_DEBUG@=======Prime AIO Processor Configuration
Apr 17 11:54:24.899 2007@LM_DEBUG@Max. number aios : 0
Apr 17 11:54:24.899 2007@LM_DEBUG@AIO Processor type: 1 SHARED
Apr 17 11:54:24.899 2007@LM_DEBUG@AIO Provider type : 402 POLL
Apr 17 11:54:24.899 2007@LM_DEBUG@=======Second AIO Processor Configuration
Apr 17 11:54:24.899 2007@LM_DEBUG@Max. number aios : 0
Apr 17 11:54:24.899 2007@LM_DEBUG@AIO Processor type: 0 DUMMY (not exist)
Apr 17 11:54:24.899 2007@LM_DEBUG@AIO Provider type : 0 DUMMY (not exist)
Apr 17 11:54:24.900 2007@LM_DEBUG@===========================================
Apr 17 11:54:24.900 2007@LM_DEBUG@(1) Create Proactor 0 Type= POLL
Apr 17 11:54:24.902 2007@LM_DEBUG@(3) 0 TaskPool started
Apr 17 11:54:45.065 2007@LM_DEBUG@(3) R_Manager=1 NEW Receiver=0
Apr 17 11:54:45.066 2007@LM_DEBUG@(3) Receiver=0 Remote=10.10.70.85:2576 Local=10.10.95.31:20002
Apr 17 11:54:45.066 2007@LM_DEBUG@(3) R_Manager=2 NEW Receiver=1
Apr 17 11:54:45.066 2007@LM_DEBUG@(3) Receiver=1 Remote=10.10.70.85:2577 Local=10.10.95.31:20002
Apr 17 11:54:45.067 2007@LM_DEBUG@(3) R_Manager=3 NEW Receiver=2
Apr 17 14:31:13.916 2007@LM_DEBUG@(3) Receiver=1016 Remote=10.100.100.10:2153 Local=10.100.100.4:20002
Apr 17 14:31:13.916 2007@LM_DEBUG@(3) Acceptor: accept failed: Too many open files
Apr 17 14:31:13.916 2007@LM_DEBUG@(3) Acceptor: accept failed: Too many open files
Apr 17 14:31:13.916 2007@LM_DEBUG@(3) Acceptor: accept failed: Too many open files
Apr 17 14:31:13.916 2007@LM_DEBUG@(3) Acceptor: accept failed: Too many open files
那位知道为什么只能接收1017个并发连接,怎样修改才能突破1017个限制,谢谢。
因字数限制,删除部分类似的信息 ulimit -n一下,看下当前用户的descriptors限制多少, 印象中默认是1024的
在/etc/system文件中加这个:
set rlim_fd_cur=xxx
//default for the number of descriptors
set rlim_fd_max=yyyy
//maximum for the number of descriptors
The "rlim_fd_cur" variable corresponds to the soft limit and the
"rlim_fd_max" is the hard limit. 楼上正解,果然是solairs本身的限制,默认情况下rlim_fd_cur=256,rlim_fd_max=1024 普通用户可以通过ulimit -n 1024将默认的256改为1024,在有root权限下可以通过修改/etc/system中的设置,如我修改的参数为
set rlim_fd_cur=20480
set rlim_fd_max=30000
set tcp:tcp_conn_hash_size=32768
这样很容易实现将近2万个并发连接。
在具体实现的过程中可能也要修改tcp_conn_hash_size修改,以下是solaris9中需要设置原因
tcp_conn_hash_size(Solaris 9 发行版)
在Solaris 10 发行版中,删除了此参数。
说明控制TCP 模块中用于TCP 连接的散列表的大小。
数据类型带符号整数
缺省值512
范围512 到1,073,741,824
含义值应该是2 的幂。
是否为动态否。只能在引导系统时更改此参数。
验证如果将此参数设置为不是2 的幂的值,则会向上舍入为最接近2 的幂的数。
何时更改如果系统始终具有数万个TCP 连接,请相应地增大该值。使用缺省值时,
TCP 最多可以执行数千个活动连接。请注意,增加散列表大小意味着占用
更多内存,因此,请设置适当的值以免造成不必要的内存浪费。
承诺级别不稳定
调整TCP的参数,等待时间间隔tcp-time-wait-interval建议设置为60000ms: /usr/sbin/ndd ?set /dev/tcp tcp_time_wait_interval 60000;
其他参数调整如下:
tcp_xmit_hiwat/tcp_recv_hiwat 131072
tcp_conn_req_max_q/tcp_conn_req_max_q0 16384
调整一个进程打开的文件描述符的数量:软限制和硬限制以及散列表的大小,修改/etc/system文件:
set tcp:tcp_conn_hash_size=32768
set rlim_fd_cur=8192
set rlim_fd_max=8192
页:
[1]