mudo服务器测试二
目录
业务处理超时测试
测试代码
客户端
服务端
同时多条请求测试
测试代码
客户端
服务端
大文件传输测试
测试代码
客户端
服务端
服务器性能压力测试说明
客户端
服务端
业务处理超时测试
测试代码
/* 业务处理超时,查看服务器的处理情况
当服务器达到了一个性能瓶颈,在一次业务处理中花费了太长的时间(超过了服务器设置的非活跃超时时间)
1. 在一次业务处理中耗费太长时间,导致其他的连接也被连累超时,其他的连接有可能会被拖累超时释放
假设现在 12345描述符就绪了, 在处理1的时候花费了30s处理完,超时了,导致2345描述符因为长时间没有刷新活跃度
1. 如果接下来的2345描述符都是通信连接描述符,如果都就绪了,则并不影响,因为接下来就会进行处理并刷新活跃度
2. 如果接下来的2号描述符是定时器事件描述符,定时器触发超时,执行定时任务,就会将345描述符给释放掉
这时候一旦345描述符对应的连接被释放,接下来在处理345事件的时候就会导致程序崩溃(内存访问错误)
因此这时候,在本次事件处理中,并不能直接对连接进行释放,而应该将释放操作压入到任务池中,
等到事件处理完了执行任务池中的任务的时候,再去释放
*/
#include "../source/server.hpp"
int main()
{
signal(SIGCHLD, SIG_IGN); // 对僵尸进程进行忽略
for (int i = 0; i < 10; i++)
{
pid_t pid = fork();
if (pid < 0)
{
DBG_LOG("FORK ERROR");
return -1;
}
else if (pid == 0)
{
Socket cli_sock;
cli_sock.CreateClient(8080, "127.0.0.1");
std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
while (1)
{
assert(cli_sock.Send(req.c_str(), req.size()) != -1);
char buf[1024] = {0};
assert(cli_sock.Recv(buf, 1023));
DBG_LOG("[%s]", buf);
}
cli_sock.Close();
exit(0);
}
}
while (1)
sleep(1);
return 0;
}
请求添加一个休眠保证它超时
客户端
服务端
同时多条请求测试
测试代码
/*一次性给服务器发送多条数据,然后查看服务器的处理结果*/
/*每一条请求都应该得到正常处理*/
#include "../source/server.hpp"
int main()
{
Socket cli_sock;
cli_sock.CreateClient(8080, "127.0.0.1");
std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
while(1) {
assert(cli_sock.Send(req.c_str(), req.size()) != -1);
char buf[1024] = {0};
assert(cli_sock.Recv(buf, 1023));
DBG_LOG("[%s]", buf);
sleep(3);
}
cli_sock.Close();
return 0;
}
客户端
服务端
客户端手动退出出现的情况
大文件传输测试
生成一个1G的大文件,里面全是0,因为是从/dev/zero里面取出来的,注意这个大概会占用2G内存,所以会传输失败,所以注意创建小一点
dd if=/dev/zero of=./hello.txt bs=1G count=1
在末尾插入一个字符
echo "qingfengyugu" >> hello.txt
查看剩余内存,下面free对应的
大的不行会本机配置太低,所以改小进行测试
测试代码
/*大文件传输测试,给服务器上传一个大文件,服务器将文件保存下来,观察处理结果*/
/*
上传的文件,和服务器保存的文件一致
*/
#include "../source/http/http.hpp"
int main()
{
Socket cli_sock;
cli_sock.CreateClient(8080, "127.0.0.1");
std::string req = "PUT /1234.txt HTTP/1.1\r\nConnection: keep-alive\r\n";
std::string body;
Util::ReadFile("./hello.txt", &body);
req += "Content-Length: " + std::to_string(body.size()) + "\r\n\r\n";
assert(cli_sock.Send(req.c_str(), req.size()) != -1);
assert(cli_sock.Send(body.c_str(), body.size()) != -1);
char buf[1024] = {0};
assert(cli_sock.Recv(buf, 1023));
DBG_LOG("[%s]", buf);
sleep(3);
cli_sock.Close();
return 0;
}
客户端
服务端
对比两者的md5值即可判断文件是否是相同的,传输也没有出现问题
86017ba5a440349e0485675753016d4a -- 1234.txt
86017ba5a440349e0485675753016d4a -- hello.txt
服务器性能压力测试说明
查看当前服务器可以同时创建多少个进程
这个当你的资源不足的时候,可以用这个进行查看PID然后kill-9进行杀死
客户端
服务端
正常退出
至此测试工作完成~
后面再补一个整合