to bluely
首先我要说 TServerSocket 的在应付大用户并发和大数据请求方面的架构写的不是很好,同样 Indy和 ICS 也是如此,这是我一直以来说的观点。
第二即使使用阻塞模式的长连接,那服务器最多也可以负载 2010-2014 个客户并发长连接(MS 网络编程一书的测试程序的写法是有问题的其只能响应1008个连接),应为一个进程最多只能创建 2016 个线程,这是进程内核堆栈大小的限制,TServerSocket 的 AcceptThread 和 ClientThread 的机制写的并不好,没有做Sleep 处理以及其它处理模式的不合理,这也是它不能负载到两千个用户和 CPU 占用率特别高的原因。
第三像你《《写一个多线程的客户端程序,每个线程开启后连接到服务器后,并以200ms的速度向服务器发送一个26字节的封包,服务器收到封包后,在封包前面加上"已经处理."字样后,返回给客户端.客户端收到后显示出来》》这种测试方法,服务器它的负荷根本就是会非常小的,所以还是服务器的 Accept 调度算法有问题,其实你只要尝试创建多个线程,而在线程处理中不作类似 Sleep 的处理,你可以马上看到这个程序一下子就会占用 CPU 的全部使用率。
第四像在完成端口中如果你还使用啦 WaitFor.... 这些内核对象的化,那么你的系统性能还是会大大降低,用户态和内核态的转换是要花费大量 CPU 执行周期的。
最后说,要实现一个高性能的服务器系统,首先要把有限的阻塞线程最大化来响应并发请求,其二要千万处理好 Accept 线程和 接收客户端请求的 Client (Peer) 线程的调度,否则系统都不用处理客户端的请求,就已经占用啦全部的 CPU 资源,其三,要尽可能的让系统调度只在用户态下运行,这是保障系统高薪能必要条件。最后还有使用设定缓存和超时处理等等。