B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-27 #21 我一直认为争论并不为出个高下,争论的好处是让每个人都有不同的收获。正所谓艺无止 境。就算你知道A方案能够解决问题,如果有人说B方案也能解决,对你并没有妨害。我希 望大家都是这种态度。
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-27 #22 陈一蛟说ServerSocket能够解决服务器方案,我想他一定有他的思路。但是我在用 ServerSocket的时候总是一个线程对应一个连接的。
M masm Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-27 #23 一个基础性问题:服务器触发OnGetThread事件后建立一个线程,那么这个线程是否就可以管理与触发这个线程的对应客户端的通信?也就是说,这个线程可以死命地读缓冲区,而系统可以保证该缓冲区收到的只有远程唯一对应的那个客户端??非阻塞模式里面靠返回socket句柄来甑别数据来自哪个远程客户端。
一个基础性问题:服务器触发OnGetThread事件后建立一个线程,那么这个线程是否就可以管理与触发这个线程的对应客户端的通信?也就是说,这个线程可以死命地读缓冲区,而系统可以保证该缓冲区收到的只有远程唯一对应的那个客户端??非阻塞模式里面靠返回socket句柄来甑别数据来自哪个远程客户端。
小 小雨哥 Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-27 #24 “ 4个进程, 每个进程4个连接。 这够不上压力测试” 非常同意,而且楼主使用的是类似 web 的工作方式(我的理解)。我在测试时实际只到达 691 个,前面的连接就开始无序掉线。虽然可以看到一根根的掉,但究竟是不是全部检测 到了所有掉线,我不敢肯定,因为多次测试反释放均出错,于是估计有的断线没有检测到。 (测试使用阻塞式、非 web 型连接,每个连接均不释放,随时可以对每个连接任意通信。)
“ 4个进程, 每个进程4个连接。 这够不上压力测试” 非常同意,而且楼主使用的是类似 web 的工作方式(我的理解)。我在测试时实际只到达 691 个,前面的连接就开始无序掉线。虽然可以看到一根根的掉,但究竟是不是全部检测 到了所有掉线,我不敢肯定,因为多次测试反释放均出错,于是估计有的断线没有检测到。 (测试使用阻塞式、非 web 型连接,每个连接均不释放,随时可以对每个连接任意通信。)
M melice Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-29 #25 我还是直接说我问题的来源吧,服务器端要求可以承受上万的链接,每个链接除了开始的时候因为验证有几百byte的数据传输,之后基本上只是偶尔会有关键数据传输。这样,大部分的链接实际上是处于近乎空链接的状况。 大家看看用什么样的模式比较好。:>
我还是直接说我问题的来源吧,服务器端要求可以承受上万的链接,每个链接除了开始的时候因为验证有几百byte的数据传输,之后基本上只是偶尔会有关键数据传输。这样,大部分的链接实际上是处于近乎空链接的状况。 大家看看用什么样的模式比较好。:>
B bluely Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-04 #27 ............................
张 张无忌 Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-29 #30 NET里的哪个类我看过他的一些成员函数,.NET下好象有封装好的完成端口的类,有BeginRecv和EndRecv什么的,
张 张无忌 Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-29 #31 我个人感觉用重叠I/O加回调函数也可以实现大量连接服务,可以部分的取代完成端口,而且他还是可以在WIN98下用,而且就我所知DFW上有位兄弟用这个模型写过股票行情服务器, 他说效果还不错。
I itren Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-30 #33 同意! 昨天我突然发现我虽然看过windows网络编程Delphi,而且也在用 Socket写程序了 竟然不知道 完全端口. 我就看了看.完全端口只是在Cpu增加后才显现出威力吧..
陈 陈一蛟 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-01 #35 首先我要说 TServerSocket 的在应付大用户并发和大数据请求方面的架构写的不是很好,同样 Indy和 ICS 也是如此,这是我一直以来说的观点。 第二即使使用阻塞模式的长连接,那服务器最多也可以负载 2010-2014 个客户并发长连接(MS 网络编程一书的测试程序的写法是有问题的其只能响应1008个连接),应为一个进程最多只能创建 2016 个线程,这是进程内核堆栈大小的限制,TServerSocket 的 AcceptThread 和 ClientThread 的机制写的并不好,没有做Sleep 处理以及其它处理模式的不合理,这也是它不能负载到两千个用户和 CPU 占用率特别高的原因。 第三像你《《写一个多线程的客户端程序,每个线程开启后连接到服务器后,并以200ms的速度向服务器发送一个26字节的封包,服务器收到封包后,在封包前面加上"已经处理."字样后,返回给客户端.客户端收到后显示出来》》这种测试方法,服务器它的负荷根本就是会非常小的,所以还是服务器的 Accept 调度算法有问题,其实你只要尝试创建多个线程,而在线程处理中不作类似 Sleep 的处理,你可以马上看到这个程序一下子就会占用 CPU 的全部使用率。 第四像在完成端口中如果你还使用啦 WaitFor.... 这些内核对象的化,那么你的系统性能还是会大大降低,用户态和内核态的转换是要花费大量 CPU 执行周期的。 最后说,要实现一个高性能的服务器系统,首先要把有限的阻塞线程最大化来响应并发请求,其二要千万处理好 Accept 线程和 接收客户端请求的 Client (Peer) 线程的调度,否则系统都不用处理客户端的请求,就已经占用啦全部的 CPU 资源,其三,要尽可能的让系统调度只在用户态下运行,这是保障系统高薪能必要条件。最后还有使用设定缓存和超时处理等等。 我自己重新写过啦服务器引擎,也是安装上面几个要点来编写的。
首先我要说 TServerSocket 的在应付大用户并发和大数据请求方面的架构写的不是很好,同样 Indy和 ICS 也是如此,这是我一直以来说的观点。 第二即使使用阻塞模式的长连接,那服务器最多也可以负载 2010-2014 个客户并发长连接(MS 网络编程一书的测试程序的写法是有问题的其只能响应1008个连接),应为一个进程最多只能创建 2016 个线程,这是进程内核堆栈大小的限制,TServerSocket 的 AcceptThread 和 ClientThread 的机制写的并不好,没有做Sleep 处理以及其它处理模式的不合理,这也是它不能负载到两千个用户和 CPU 占用率特别高的原因。 第三像你《《写一个多线程的客户端程序,每个线程开启后连接到服务器后,并以200ms的速度向服务器发送一个26字节的封包,服务器收到封包后,在封包前面加上"已经处理."字样后,返回给客户端.客户端收到后显示出来》》这种测试方法,服务器它的负荷根本就是会非常小的,所以还是服务器的 Accept 调度算法有问题,其实你只要尝试创建多个线程,而在线程处理中不作类似 Sleep 的处理,你可以马上看到这个程序一下子就会占用 CPU 的全部使用率。 第四像在完成端口中如果你还使用啦 WaitFor.... 这些内核对象的化,那么你的系统性能还是会大大降低,用户态和内核态的转换是要花费大量 CPU 执行周期的。 最后说,要实现一个高性能的服务器系统,首先要把有限的阻塞线程最大化来响应并发请求,其二要千万处理好 Accept 线程和 接收客户端请求的 Client (Peer) 线程的调度,否则系统都不用处理客户端的请求,就已经占用啦全部的 CPU 资源,其三,要尽可能的让系统调度只在用户态下运行,这是保障系统高薪能必要条件。最后还有使用设定缓存和超时处理等等。 我自己重新写过啦服务器引擎,也是安装上面几个要点来编写的。
陈 陈一蛟 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-01 #36 其实我一直在说一个观点,那就是在高并发请求的状态下,《《《阻塞性能要好于非阻塞,同步要好于异步》》》,在一般来说,同步只需要两步处理,而异步需要三步处理,
张 张无忌 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-01 #37 To 陈一蛟: 对于你的观点我不感苟同,至于你说WaitFor类型的函数比较耗CPU时间,确实如此,在组塞模式下系统依然会在组塞的时候内部调用这些函数,只是不需要你写出来罢了,你以你的代码里没这些函数就说明组塞效率高没有任何道理.和你上次说recv比WSARec效率高基本是一个道理.MS的Winsock设计本身就是有利于非组塞的,曾经有杂志上说过这个方面的问题,MS内部也有过讨论,最终MS选择了非组塞方式来设计Socket的,所以MS的自己的软件也都是用非组塞就更说明了这个问题,
To 陈一蛟: 对于你的观点我不感苟同,至于你说WaitFor类型的函数比较耗CPU时间,确实如此,在组塞模式下系统依然会在组塞的时候内部调用这些函数,只是不需要你写出来罢了,你以你的代码里没这些函数就说明组塞效率高没有任何道理.和你上次说recv比WSARec效率高基本是一个道理.MS的Winsock设计本身就是有利于非组塞的,曾经有杂志上说过这个方面的问题,MS内部也有过讨论,最终MS选择了非组塞方式来设计Socket的,所以MS的自己的软件也都是用非组塞就更说明了这个问题,
K kycheung Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-01 #38 非常感謝樓主的推薦!不錯,經典! 還有沒有! 貼上來或E給我! kycheung@yeah.net 好好學習,天天向上!
K kycheung Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-01 #39 各位,對於scoket編程方面有沒有什麼好的資料,可不可以發一份給我學習學習,或者推薦幾本好書都可以!TKS kycheung@yeah.net
陈 陈一蛟 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-01 #40 To 张无忌: 因为我在 Debug 上面比较弱,所以我想问,你怎么确定在组塞模式下系统依然会在组塞的时候内部调用 WaitFor 这些函数,其二你上次说 recv 是架构在 WSARec ,请问你是怎么调试出来的? 我记得我我以前看过一本 Windows 系统编程的书,作者自己就说自己以前在书上曾经宣传过不少错误的观点,经过后来编程实践,发现自己的不少错误观点。 我不认为在阻塞模式下阻塞函数会内嵌套 WaitFor 类函数,因为我不会使用 Debug ,我也是观测 CPU 占用率估计的,在一个服务器中,使用 WaitFor 类函数不使用此类函数,其 CPU 占用率有着显著的区别。其实如果会 Debug ,只要调试一下 函数跳转,就可以看出来是不是这种方式运行的。 曾经有杂志上说过这个方面的问题,MS内部也有过讨论,最终MS选择了非组塞方式来设计Socket的,所以MS的自己的软件也都是用非组塞就更说明了这个问题, 我记得 FreeBSD 中曾经说过, MS 或者其它系统 Socket 模型及其基础都是来自于 BSD 的 Socket 模型的。
To 张无忌: 因为我在 Debug 上面比较弱,所以我想问,你怎么确定在组塞模式下系统依然会在组塞的时候内部调用 WaitFor 这些函数,其二你上次说 recv 是架构在 WSARec ,请问你是怎么调试出来的? 我记得我我以前看过一本 Windows 系统编程的书,作者自己就说自己以前在书上曾经宣传过不少错误的观点,经过后来编程实践,发现自己的不少错误观点。 我不认为在阻塞模式下阻塞函数会内嵌套 WaitFor 类函数,因为我不会使用 Debug ,我也是观测 CPU 占用率估计的,在一个服务器中,使用 WaitFor 类函数不使用此类函数,其 CPU 占用率有着显著的区别。其实如果会 Debug ,只要调试一下 函数跳转,就可以看出来是不是这种方式运行的。 曾经有杂志上说过这个方面的问题,MS内部也有过讨论,最终MS选择了非组塞方式来设计Socket的,所以MS的自己的软件也都是用非组塞就更说明了这个问题, 我记得 FreeBSD 中曾经说过, MS 或者其它系统 Socket 模型及其基础都是来自于 BSD 的 Socket 模型的。