比如:服务器上运行一C#的winForm程序.
Socket方面的 如果有连接就创建一个线程
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, int.Parse(txt_port.Text))); socket.Listen(10000);//不知道是干啥的 就写10000了 socket.BeginAccept(new AsyncCallback(ClientAccepted), socket); 所以在每次有连接的时候 都走了ClientAccepted然后会默认开个线程..
如果2003系统4G内存 最高可以有多少个连接?跟CPU有关系吗?
是不是电脑的线程没了 就死机了?
一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。
当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。
当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。
有连接就开一个线程的设计和上次一个人说要做一个表格控件,每个单元格都是一个自定义控件,搞得句柄不够用的有的一拼。
ClientAccepted里也用socket异步接收,没必要每个连接开一个线程,浪费资源。
另外32位的系统,我测试过每个进程可以开1800-1900多个线程封顶。超过后,其他线程都会处于等待状态,不会运行,直到有运行的线程退出。
我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接,如果你每个连接开一个线程,那么你能保持的TCP连接数受到线程数影响,只能不到2000个
另外32位的系统,我测试过每个进程可以开1800-1900多个线程封顶。超过后,其他线程都会处于等待状态,不会运行,直到有运行的线程退出。
我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接,如果你每个连接开一个线程,那么你能保持的TCP连接数受到线程数影响,只能不到2000个
服务器 不要用同步。
客户端同步异步都可以
线程是个好多好东西,但不能滥用。
32位系统一个进程用户空间为2G,一个线程默认需要1M堆栈(最少128K),可以算一算极限。
服务器要么异步(系统队列),要么自己处理队列。
Accept可能没必要异步,用一个线程同步处理更好。
另外活动线程太多的话,频繁的上下文切换很耗CPU。
服务器要么异步(系统队列),要么自己处理队列。
Accept可能没必要异步,用一个线程同步处理更好。
另外活动线程太多的话,频繁的上下文切换很耗CPU。
可以开N多个,N和你的内存大小相关,但是后面的都会挂起。
—- 10分
socket.Listen(10000);//不知道是干啥的 就写10000了
看方法说明啊
BeginAccept并不是你想的那样执行一次开一个线程,实际情况是bind一个线程池线程,异步执行完后
会放回线程池,池内会保持几个(默认与CPU数量有关)空闲线程活动(减小频繁创建-销毁线程的开销)
池最大可运行的线程数量,可以通过System.Threading.ThreadPool.GetMaxThreads获取,相应地还有个Set方法,
一般情况不需要考虑最大数量(真到那时候加服务器吧),有些情况通过设置最少活动线程SetMinThreads来提高性能
看方法说明啊
BeginAccept并不是你想的那样执行一次开一个线程,实际情况是bind一个线程池线程,异步执行完后
会放回线程池,池内会保持几个(默认与CPU数量有关)空闲线程活动(减小频繁创建-销毁线程的开销)
池最大可运行的线程数量,可以通过System.Threading.ThreadPool.GetMaxThreads获取,相应地还有个Set方法,
一般情况不需要考虑最大数量(真到那时候加服务器吧),有些情况通过设置最少活动线程SetMinThreads来提高性能
—-
队列!!!!!!!
—-
开多少线程 和你CPU 有关系···
—-
现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?
—-
百万级别的这个就得做均衡负载了,这个可不是靠程序优化就能解决的
—-
现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?
没有活动的异步连接,基本上只是消耗内存而已。
—-
没有限制,但开多了很慢
—-
微软操作系统的线程一共才几百个。
你想想你的程序开多了会在怎样
—-
xiaozhu39505 小辉?
呵呵,在这里见到你了,好久没联系了,当时我们用 socket异步修改程序后续的情况我不是很清楚了,实际运行后对服务器的占用率有多大?
现在我又一次面对当时的情况了,是一个手机端即时通讯程序,需要连几万个客户端
—-
xiaozhu39505 小辉?
呵呵,在这里见到你了,好久没联系了,当时我们用 socket异步修改程序后续的情况我不是很清楚了,实际运行后对服务器的占用率有多大?
现在我又一次面对当时的情况了,是一个手机端即时通讯程序,需要连几万个客户端
哈哈,谷哥吗?当时只是测试的可连接数,没有具体测试服务器负载情况。socket异步里就使用了完成端口,用异步是效率最高的,至于负载情况,还得具体测试才行哈
—-
貌似有线程池