这是一个关于各种IO模型的socket server实现与测试。
这里采用多种模型实现了一个TCP ECHO服务器,将client发送的内容echo回去。
client每秒会发送一次请求,server保持并发连接并进行相应。
现已实现的模型:
- base: 最原始的echo服务器
- thread: 多线程模型
- select: select模型
- poll: poll模型
- epoll: epoll模型
- 修改
src/clients.sh可以生成指定数量的client - 修改
src/base.cpp中的MAX_CLIENT_NUM参数调整server最大服务数 - 修改
src/base.cpp中的CLIENT_INTERVAL参数调整client发包间隔 - 修改
Makefile中的DEBUG参数确定是否输出调试信息
修改Makefile中的DEBUG变量可以控制是否输出包内容。
make,bin目录会生成可执行文件。
client: 请求端,每隔一秒发送一次请求。clients.sh: 一次启动多个clientbase_server: 最原始的server,同时只能服务一个clientthread_server: 多线程版server,每当一个新用户到来时启动一个新的线程进行服务select_server: select版server,通过select管理连接poll_server: poll版server,通过poll管理连接epoll_server: epoll版server,通过epoll管理连接
CPU占用率
| 并发数\模型 | thread | select | poll | epoll |
|---|---|---|---|---|
| 1k | 2-3% | 10-20% | 10-20% | 1-2% |
| 2k | 4-7% | X | 43-52% | 2-4% |
| 4k | 11-12% | X | 84-88% | 7-8% |
| 8k | 17-18% | X | 72-74% | 11-12% |
- select最大到1024,再进行连接会崩溃。
- poll在8k的时候cpu占用率反而下降了,情况不明。。。
- epoll确实是最优的选择,虽然cpu上和thread差不多,但内存差距特别大。
- thread是最简单的实现,一个连接一个thread,用thread poll效果应该会好的多。