客户端多线程分组模拟高频并发数据
前言
一、客户端升级模型
1、设计概述
2、设计思路
二、测试
- 测试环境 -> Windows本地 -> Release86
1、EasyTcpServer_t1_c1024 -> EasyTcpClient_t1_c1000_m100x1
2、EasyTcpServer_t1_c1024 -> EasyTcpClient_t4_c1000_m100x1
3、EasyTcpServer_t1_c1024*4 -> EasyTcpClient_t4_c4000_m100x1
4、测试结论
- 我们可以看到,服务端在单线程,FD_SIZE=1024的情况下
- 客户端使用单线程,1000连接,每个发送100K的消息包,服务端每秒可以处理8万多消息包
- 客户端使用4线程,1000连接,每个发送100K的消息包,服务端每秒可以处理60多万消息包
- 客户端使用4线程,4000连接,每个发送100K的消息包,服务端每秒可以处理40多万消息包
- 客户端使用了多线程的情况下,这样可以通过连接数或者消息包的数量来提高客户端的消息发送频率
- 这样可以帮助测试
服务端性能瓶颈
- 这样可以帮助测试
三、完整代码
1、client.cpp
#include "EasyTcpClient.hpp"
#include<thread>
bool g_bRun = true;
void cmdThread()
{
while (true)
{
char cmdBuf[256] = {};
scanf("%s", cmdBuf);
if (0 == strcmp(cmdBuf, "exit"))
{
g_bRun = false;
printf("退出cmdThread线程\n");
break;
}
else {
printf("不支持的命令。\n");
}
}
}
//客户端数量
const int cCount = 4000;
//发送线程数量
const int tCount = 4;
//客户端数组
EasyTcpClient* client[cCount];
void sendThread(int id)
{
//4个线程 ID 1~4
int c = cCount / tCount;
int begin = (id - 1) * c;
int end = id * c;
for (int n = begin; n < end; n++)
{
client[n] = new EasyTcpClient();
}
for (int n = begin; n < end; n++)
{
client[n]->Connect("127.0.0.1", 4567);
printf("thread<%d>,Connect=%d\n", id, n);
}
std::chrono::milliseconds t(5000);
std::this_thread::sleep_for(t);
Login login;
strcpy(login.userName, "lyd");
strcpy(login.PassWord, "lydmm");
while (g_bRun)
{
for (int n = begin; n < end; n++)
{
client[n]->SendData(&login);
//client[n]->OnRun();
}
}
for (int n = begin; n < end; n++)
{
client[n]->Close();
}
}
int main()
{
//启动UI线程
std::thread t1(cmdThread);
t1.detach();
//启动发送线程
for (int n = 0; n < tCount; n++)
{
std::thread t1(sendThread, n + 1);
t1.detach();
}
while (g_bRun)
Sleep(100);
printf("已退出。\n");
return 0;
}