当前位置: 技术问答>linux和unix
高分求救!Linux下网络服务器程序问题(急急急……)
来源: 互联网 发布时间:2016-07-02
本文导语: 我要开发一个C/S架构的程序,客户端和服务器端都是Linux系统(Fedora Core 3),通过TCP通信。基本思想如下: client周期性地以特定格式向server端发送TCP消息(周期一般为2分钟),server端收到client发来的消息后进行解析, 将解析...
我要开发一个C/S架构的程序,客户端和服务器端都是Linux系统(Fedora Core 3),通过TCP通信。基本思想如下:
client周期性地以特定格式向server端发送TCP消息(周期一般为2分钟),server端收到client发来的消息后进行解析,
将解析出来的参数写入数据库中,同时要发送一个回应消息给客户端。
每个服务器端要求支持不少于3000个客户端,即能够同时准确接收处理3000个客户端的连接请求和消息处理。
开发之前查阅了相关资料,据说linux下的select机制最大只能支持1024个fd,因此我在服务器侧采用了Linux的epoll机制。
服务器端的服务程序分为两个模块,
一个为commshell模块:负责接受客户端的TCP连接请求,接收客户端的TCP消息,并将接收到的消息转发给SM模块。同时,
此模块还要接收SM模块发送来的消息,并转发给对应的客户端,实质上就是一个通信转发模块。
另一个为SM模块:负责接收commshell模块发送来的 客户端的信息,并进行解析,写入数据库,同时发送回应消息给commshell。
现在功能都已经测试完成没有问题,但是我模拟了多个客户端发现服务器端只能支持几十个客户端。
不知道这是什么原因造成的呢?是由于多线程问题吗?还是我的epoll机制使用不正确呢?
请高手帮忙,分不够可以再加,多谢!!!
可能描述不太清楚,需要更多细节的尽管留言
|
上面说了。用ulimit查看一下你的进程栈大小是多少,文件描述符大小是多少,是否满足你的程序需要,如果没有改大他。
然后流程大致是:
设置监控链接的描述符
while(1){
epoll_wait()
如果发现新链接
将新链接加入监控集合
发现连接断开
将该链接从监控集合中删除
如果是数据读写
读写数据
}
然后流程大致是:
设置监控链接的描述符
while(1){
epoll_wait()
如果发现新链接
将新链接加入监控集合
发现连接断开
将该链接从监控集合中删除
如果是数据读写
读写数据
}
|
谁说linux下只支持1024个socket的啊?1024是ulimit的限制,你打ulimit -a命令看下,有一行是这样的:
open files (-n) 1024
自己改大一点就可以了。
比如说用ulimit -n 5000,试试看。
open files (-n) 1024
自己改大一点就可以了。
比如说用ulimit -n 5000,试试看。
|
一个client和server没有必要建立一个永久链接,udp一样可以再应用层保证他的可靠性。
这点同意吧?因为tcp的下层是ip层,同样是无连接的协议。
无连接方式避免了这一个client和server在2分钟内只干一次活浪费的资源,同时提供了高
可扩展性,几千,甚至上万的客户端一样可以支持。两分钟内几千甚至上万个连接对于一个server来说很一般。
你数据库放在sm,他和commshell是否有阻塞关系?进程不同不代表没有阻塞关系。
我说数据库锁表的事情是想让你把sm模块剥离开,单拿commshell模块去测试,避免由其他问题导致
问题的表现和原因不一致。
这点同意吧?因为tcp的下层是ip层,同样是无连接的协议。
无连接方式避免了这一个client和server在2分钟内只干一次活浪费的资源,同时提供了高
可扩展性,几千,甚至上万的客户端一样可以支持。两分钟内几千甚至上万个连接对于一个server来说很一般。
你数据库放在sm,他和commshell是否有阻塞关系?进程不同不代表没有阻塞关系。
我说数据库锁表的事情是想让你把sm模块剥离开,单拿commshell模块去测试,避免由其他问题导致
问题的表现和原因不一致。
|
另外,用ulimit查看一下你的进程栈大小是多少,文件描述符大小是多少,是否满足你的程序需要,如果没有改大他。
|
代码太长了,没看。
2分钟才有一次连接,建议你改成非连接方式的socket。
这样模型比较好维护,性能也不错。
根据你的描述,还有插入数据库的操作,怀疑是这里影响了你的连接数,insert操作要锁表,阻塞了你的其他链接的操作。
你可以去掉数据库相关操作,或者前面用一个任务池缓存一下你的操作避免并发时阻塞。
2分钟才有一次连接,建议你改成非连接方式的socket。
这样模型比较好维护,性能也不错。
根据你的描述,还有插入数据库的操作,怀疑是这里影响了你的连接数,insert操作要锁表,阻塞了你的其他链接的操作。
你可以去掉数据库相关操作,或者前面用一个任务池缓存一下你的操作避免并发时阻塞。