mudo服务器测试二

文章详细描述了业务处理超时测试的方法,包括并发请求、服务器性能瓶颈、大文件传输以及服务器资源管理。测试代码示例展示了如何处理超时问题,确保客户端和服务端正确交互。还提到了服务器性能压力测试的要点,如并发进程创建和资源监控。
摘要由CSDN通过智能技术生成

目录

业务处理超时测试

测试代码

客户端

服务端

同时多条请求测试

测试代码

客户端

服务端

大文件传输测试

测试代码

客户端

服务端

服务器性能压力测试说明

客户端

服务端


业务处理超时测试

测试代码

​
/* 业务处理超时,查看服务器的处理情况
    当服务器达到了一个性能瓶颈,在一次业务处理中花费了太长的时间(超过了服务器设置的非活跃超时时间)
     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进行杀死

客户端

服务端

正常退出

至此测试工作完成~

后面再补一个整合

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风玉骨

爱了!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值