找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5847|回复: 2

TProactor的问题

[复制链接]
发表于 2008-7-13 23:28:57 | 显示全部楼层 |阅读模式
要在solaris和windows下实现几千个并发数连接的服务端,Reactor看来是不行了,就转到Proactor上,在Windows下测试没有问题,在Solairs下运行占用CPU巨多,经常90%以上,查资料一看,原来Proactor模式,ACE封装的并不好,需要用TProactor来替代,从[url=http://terabit.com.au/solutions.php]http://terabit.com.au/solutions.php[/url]下载代码,在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个限制,谢谢。
因字数限制,删除部分类似的信息
 楼主| 发表于 2008-7-13 23:29:04 | 显示全部楼层
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.
 楼主| 发表于 2008-7-13 23:29:20 | 显示全部楼层
楼上正解,果然是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
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 16:23 , Processed in 0.017181 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表