B服务器是Unix的,A还在继续向B发送数据包,但是B没有返回了,不知道
怎么回事
怎么回事
解决方案 »
- 1=1
- 怎样用tidhttp获取http://m.iask.com/g?k=%B0%A2%B6%C5的页面信息
- 为什么我的应用程序服务器会和客户端一起退出
- 一个VB写的控件导入到delphi后,不能显示在控件面板上,如何在窗体上显示使用该控件?
- 怎样快速将一个execl表导入到sqlserver数据库表中,
- 用ADO如何实现事务处理
- delphi7 访问 ORACLE的BLOB类型
- MTS对象提交数据出错求教(错误信息:一个会话中无法启动更多的事务)我刚注册,没多少分数。请大家拉我一把。
- 关于ADO的问题???//
- InsideDelphi 来拿分吧。兄弟无已回抱。给你点分吧。
- 怎么退出
- 两个问题 请大侠多多指点
还有没有什么办法解决,谢谢先
ePing
返回信息失败,这属于正常吗?ePing
刚才测试出是Unix仍然能够收到数据,但是负责发送数据到A的子进程起
不来,我想这个可能和Socket没有关系了,这个原因是由于什么导致的
你有没有这方面的经验??ePing
这样可不行,我们现在正在测试,每次都是将近发了16000多条件交易,
B就不能动了,Kill掉,重启,当然可以啦ePing
现在测试的交易的一条数据就来回200个字节,呵呵,很小的啦ePing
同意你的想法,那你觉得会是那个地方出了毛病ePing
如果每次都在16000的附近出问题,这种可能性就更大了。
你查一下server B 的系统资源使用情况看看
在Windows环境下,用SOCKETS建一个Server,采用不阻塞的方式,我采用的
是注册一个窗体来响应消息,但听说当用户量大的话窗体就不够用,如果用
多线程的话,线程太多就开销太大(可能有10万用户),有什么方法解决
这个问题。这里高手多,解决后保证重开贴子给分
谢谢!
你可以建立一个线程池,线程池里面有N个线程,其中有一个线程负责调度工作,
在任一时刻由另外的N-1个线程处理客户请求,如果某一时刻请求的个数大于线程个数,你就需要创建一个队列用于给这些请求排队,以决定谁先被调度给线程池处理,线程池的每一线程都有一个状态标记,以指示该线程处于忙或空闲状态,如果某个线程由忙转入空闲,则调度线程会检测当前队列中有无请求,如有,则调度线程会将此线程调度去处理队列中的请求。其实线程池的原理与电信局中的响应拨号
用户上网的MODEM池的原理是相似的。
1。使问题出现;
2。attach debugger到B服务进程;
3。在网包接收调用(比如select或read system call)后的下一语句设断点;
4。继续程序的执行;如果程序不运行到断点,那是通讯问题(包括缓冲已满),请看后面的关于通讯的分析;
5。从段点处往下在debugger内执行,如果不是多线程程序,很容易找到问题所在。如果是多线程程序,就会复杂些,它和你的线程模型有关。一般来说,你可以通过设断点来跟踪新线程。通讯分析:
打开(运行)network niffer(sniffer, TCP dump等)来跟踪从A到B的包。当问题出现时看包是否从A送到B。如果没有,而且网络没问题,那么很可能是B的缓冲已满,虽然A还能送(你说的),但它只是送到它的缓冲(再过一会它也会满,然后就不能再送了)。缓冲的加大不能从根本上解决你的问题,它只是推迟问题的出些。所以你不能依赖它。而缓冲溢出的根本原因是B比A慢。只有B比A快才能从根本上解决问题。缓冲只能在突发的大量服务请求是起点作用(缓冲该然后设置,最好找本UNIX performance tuning的书来看。它有大中小三类,合理分配才能起到大作用,瞎调无益)。
如果包确实是从A送到B了,那么B的缓冲一定没满。
因为一般来讲通讯资源不足是出在客户端的,而服务器端一般都能正常释放资源(除非你一直没有释放),我想你的unix机器应该是服务器端吧?测试unix下socket资源状态(netstat -p tcp),如果里面有很多Close_Wait,就不正常了!
1.(客户端问题)
包阻塞的情况多发生于缓冲区域充满了数据,客户端不再进行读取操作时。
这种情况下,可能是由于客户端的处理节奏慢于接受包的速度,可以考虑
将包处理过程放入线程处理,而对包的接受采用阻塞的方式。
2.(服务器端问题)
由于数据包头中部分变量的类型定义不合理而引起包的流水号越界或溢出,
都可能导致服务器端出现core文件或异常停止。建议如果有在包头中定义
流水号等,用long型变量。
3.(协议包问题)
在大数据量传输中,尽量减少网络资源的重复使用次数,所以在网络状况
佳的情况下,建议将原有的包体长度适当的扩大。如2k扩大到30k左右,
同时可以减少客户端的处理次数。
多谢大家,希望能够继续讨论,往前推ePing
大家可以继续讨论一下与之相关的问题嘛ePing
一般来说Unix下的Socket如果是多线程的最好采用端口复用,就是连接处理完毕以后把连接pooling起来而不是释放,下次再有连接到来的话取出给新的进程使用
但是这个实在是比较复杂的技术,在这里没有办法完全写出来,建议你看看有一套共三卷的TCP/IP的书.
我认为一个简单的处理是对fork出的子进程数量作个限定,超过限定的就等待有子进程完成对socket的操作,再吧这个子进程的socketID给新的子进程
我曾经碰到过,在一个特定分支continue 时忘了unlock
另外,如果是用线程,须注意UNIX下线程结束时并不完全释放资源,当线程产生到一定量时,就再也不能产生了。在Solaris上试过,大概4000个线程
强烈推荐!强烈推荐!强烈推荐全新的调查!
强烈推荐!强烈推荐!强烈推荐!强烈推荐全新的调查,谢谢!http://www.csdn.net/Expert/TopicView1.asp?id=655336
可能还是程序的问题
我觉得有两种可能,就是b没有收到a的reply消息,或者是a没有收到b的reply消息
查一下程序吧