。。。。。。。。。。。。 (0分)

  • 主题发起人 主题发起人 陈一蛟
  • 开始时间 开始时间

陈一蛟

Unregistered / Unconfirmed
GUEST, unregistred user!
。。。。。。。。。。。。。
 
1、线路质量 任何方式到最后都要用网卡发送,接收数据,一个时刻只能有一个缓冲区中的数据在发送接受,如果这个连接的状况很差,那么后面队列的数据的发送势必受到影响。
2、系统能力 包括网卡,内存,CPU
3、运气 100个线程,99个空闲,1个要发送,可是刚刚轮巡过,真倒霉!
 
在完成端口下一个线程管理数千个连接也没有问题。但ServerSocket中一旦发生连接就会
触发OnGetThread事件,建立一个线程。你用的ServerSocket不是这样吗?
 

to 王坏人:
贴主: 要想完成几百个连接以上服务器, 必须抛弃线程模型, 使用 EVENT 和IO重叠模型
我这里曾经有过具体测试, 阻塞的多线程模型服务器最多跑到过600多连接。
服务器 : P4. 2.4G 两个 双路XEON 内存 2G

》》》我前天阻塞模式的压力测试,测试啦两个多小时,开啦四个客户端进程,每个进程有4个连接线程,服务器端运行啦 10 个线程的线程池,在两个小时内响应啦 3 百 50 多万次的并发请求服务。服务器在这两个小时内终于没有出现任何问题(写啦两个多月,阻塞到非阻塞,后又从非阻塞从新转成阻塞模式,最后两个星期就只写啦三百多行代码)。

关于性能:
1、阻塞同步模式只需要系统两次请求,而非阻塞异步模式却需要系统三次请求
2、Event 和重叠模式需要进行内核态和用户态的转换,这个是必须的,简单的阻塞模式是可以不要进行这种转换的。
3、完成端口我一直认为它是采用纤程的模式来实现一个线程调度多个纤程,并用纤程与 Socket 请求一一对应的方法响应 Socket 请求,所以看起来好像是一个线程响应啦多个连接一样的,而纤程实际上就是用户态的多线程。另外完成端口也是采用异步模式,也会多一次系统请求。
4、在高负荷的系统中,多一次请求,累计起来系统的资源占有率将会是非常大的(想想 1 千万次的并发请求情况下?)。
5、多线程的轮巡,在用户态模式下,其开销不是大家想象的那么大,当然还要看线程执行代码的优劣行,开销很大是因为它触发啦内核态和用户态的相互转换。


 
哪位机器上装有VC6,给我发一份Winsock2.h? barton131420@163.com
 
你的测试中每次请求有用户数据交换吗还是仅仅只是连接一下?
 


to masm:
3、运气 100个线程,99个空闲,1个要发送,可是刚刚轮巡过,真倒霉!

》》》这个是你线程的调度策略存在大的缺陷,在99个空闲的时候,系统其实就应该不发生任何轮巡动作。

在线程调度模型中,INDY, Borland Socket,ICS 做的都不好。

 
to barton:
你的测试中每次请求有用户数据交换吗还是仅仅只是连接一下?

》》》》当然有数据交换,客户连接到,服务器发送欢迎语句,客户端接收后,发送请求服务数据,服务器在完成请求后发送回复数据给客户端,服务器断开客户连接,客户端接收到服务器回复数据后,断开与服务器的连接。

 
陈: 4个进程, 每个进程4个连接。 这够不上压力测试

看我的压力测试:
完成端口模型, 20个进程, 每个进程启动后发送150个连接到服务器, 连接后服务器发送120K数据到客户端

监测内容1 : 监测高度并发情况下的丢连接情况, IOCP模型很好的完成工作, 3000个连接一个没丢

监测内容2: 核实每个连接收到的数据的完整性。 结果全部正确。

因为服务器是我的笔记本(IBM P4 1.8G 512M), 所以未做更高压力的测试。

 

另外我其实不太认可使用 MS 扩展的 Socket,在 MS 基本的Socket 函数是使用 BSD 的算法实现,这是非常经典和稳定的。

 
gz...我当个看客算了...
 

完成端口模型, 20个进程, 每个进程启动后发送150个连接到服务器, 连接后服务器发送120K数据到客户端

因为服务器是我的笔记本(IBM P4 1.8G 512M), 所以未做更高压力的测试。

》》》》我看这个时候客户端就处在高负荷的线程轮巡中,服务器端的负荷反而小啦,测试方法有问题。



 
各位老大继续呀!!!!!
还有请各位老大解释一下传奇(RCR/32)传输协议以及网金每次登陆传输编码不同的一些具体情况。
 
完成端口模型, 20个进程, 每个进程启动后发送150个连接到服务器, 连接后服务器发送120K数据到客户端

因为服务器是我的笔记本(IBM P4 1.8G 512M), 所以未做更高压力的测试。

》》》》我看这个时候客户端就处在高负荷的线程轮巡中,服务器端的负荷反而小啦,测试方法有问题。

可能也会是我理解不够!!!

 
测试的时候还是服务器和客户端分别在不同的机器上比较可靠。
 
我发了 winsock2.h
 
我的20个客户端进程分别跑在6台机器上, 共3000个连接
完成端口服务器进程的CPU占用率非常低, 客户端用的ICS控件, 每个客户端进程
NEW 出来 150个 WSOCKET 连接服务器


另: 看了你上面说的关于IOCP 模型工作于纤程的观点, 我不同意。
IOCP的工作模型用图形表达比较容易, 用文字表示起来很繁琐,
纤程的出现是 MS 为了 UNIX程序移植到 MS 环境所开发, 我不认为使用纤程比线程
速度快, INDY10 号称要使用完成端口, 翻了它的源码后发现INDY10实际上没有使用完成端口API, 它的BETA版已经发出来了, Indy10使用纤程技术是为了能使 INDY 在UNIX 和 MS 上跑起来一致
 
>>另外我其实不太认可使用 MS 扩展的 Socket,在 MS 基本的Socket 函数是使用 BSD 的
>>算法实现,这是非常经典和稳定的。

我想知道,你用什么方法来终止Listen线程?
AcceptEx的逻辑显然比Accept强。也没有理由认为MS扩展不稳定吧?Accept似乎在阻塞后
无法通过正常途径终止吧?
 
我真是服了barton大哥上面帖子的回复了,晕死呀...
 
to 陈一蛟:
winsock2是分层的,那些函数和地层实现是分开的,也就是他是分层次的,基本recv其实最终是用的WSARecv,所以根本就没有winsock不正宗,相反recv要经过函数转换,速度可能要慢点... [:D]
 
后退
顶部