在工作中,我们可能经常会用到压力测试等循环执行执行发包的机制,为了防止目标机压力过大,必然需要一个限速逻辑来进行控制,之前在网上看了看,发现基本没有这方面的介绍,于是自己写了一个。
这段代码使用了已经大半年,基本能够满足各种限速的要求,其中的动态调整逻辑也能够保证对限速本身对cpu的消耗不会太大,希望对大家有所帮助。(ps:这段代码是在linux下使用的,当然只需要将获取时间的函数改一下,那么在windows下也可以使用的,如果有朋友改了记得通知我一下哦~~)

#include <sys/time.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
struct timeval tpstart,tpend;
int timeuse;
gettimeofday(&tpstart,NULL);
int countPerSec=0;//计算请求数
int statCount;//统计用
int iMaxReqPerSec=100;//最大限速
int trueMaxReq=iMaxReqPerSec;//动态调整的判定大小
while(1)
{
    //业务要做的事情,在下面这个函数里完成就可以了
    DoSomeThing();
    //下面都是控制速度
    ++countPerSec;
    if(countPerSec<trueMaxReq)
    {
        continue;
    }
    gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;//微秒
    if(timeuse<=1000000 )
    {
        if(countPerSec>=iMaxReqPerSec)
        {
            statCount=countPerSec;
            usleep(1000000-timeuse);
            gettimeofday(&tpstart,NULL);
            countPerSec=0;
        }
    }
    else
    {
        statCount=countPerSec*1000000/timeuse;
        //动态调整
        trueMaxReq=statCount;
        gettimeofday(&tpstart,NULL);
        countPerSec=0;
    }
}

基本上对循环执行的限速逻辑就是这样了,如果大家觉得还有什么问题,欢迎指教。

版权所有,转载请注明出处。http://www.vimer.cn

游戏服务器端架构升级之路-V3重构

一. 前言 2016年6月17日凌晨5点钟,我们完成了服务器端V3版本的重构,切换的过程十分平滑且没有对线上用户产生任何影响。 这也正式标志着,我们的游戏服务器...

阅读全文

游戏服务器端架构升级之路

这几天的心情非常好,主要原因是我们把服务器端的架构升级到了 2.0,这样最大的一个好处就是: Server重启完全不会影响外网服务 所以,也是想趁此机会,服务...

阅读全文

用netstat查看网络状态详解

一、Linux服务器上11种网络连接状态:                                           图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三...

阅读全文

发表评论