C 實現伺服器壓力測試框架

2021-06-29 00:47:21 字數 2718 閱讀 2591

c++實現伺服器壓力測試框架

flyfish 2015-3-9

模擬大量客戶端對伺服器進行壓力測試框架

標頭檔案

#pragma once

#include #include #include #include #include class csession:

public boost::enable_shared_from_this;

實現檔案

#include "session.h"

csession::csession(

const std::string ip,

unsigned short port,

int heartbeat_timer_minutes,

boost::asio::io_service& io_service_)

: m_resolver(io_service_),

m_sock(io_service_),

heartbeat_timer(io_service_),

m_nconnectstate(0),

m_ep(boost::asio::ip::address::from_string(ip),port),

m_pobj(nullptr),

m_heartbeat_timer_minutes(heartbeat_timer_minutes),

m_nheartbeatcount(0)

void csession::start()

csession::~csession(void)

void csession::stop()

std::size_t csession::check_frame(const boost::system::error_code &ec, std::size_t bytes_transferred)

void csession::parse_frame(const boost::system::error_code &ec, std::size_t bytes_transferred) }

void csession::start_receive()

void csession::receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred)

else }

void csession::heartbeat()

void csession::heartbeat_handler(const boost::system::error_code &ec)

else }

void csession::login()//登入

void csession::login_handler(const boost::system::error_code &ec,std::size_t bytes_transferred)

else }

void csession::connect_handler(const boost::system::error_code &ec)

else }

void csession::start_send()

}void csession::send_handler(const boost::system::error_code &ec)

}

在start中呼叫async_connect,當連線完成時,connect_handler就會被呼叫,通過 ec檢視有沒有連線成功, 

每當有乙個或多個位元組被接收並儲存至緩衝區時,receive_handler() 函式就會被呼叫。

通過 ec檢視有沒有接收成功,  bytes_transferred 表示具體接收的位元組數。

為了接受緩衝區 staying alive,所以使用了enable_shared_from_this

shared_from_this不能在建構函式中使用,所以連線函式放在start中

使用方式

class client

;std::vectorclient_queue;//儲存生成的客戶端例項

boost::asio::io_service m_io_service;

boost::asio::io_service::work m_work(m_io_service);//即使io任務完成,也不退出

std::string ip="192.168.1.1";

unsigned short port=8000;

int heartbeat=10;

for (int i=0;ip (new csession(ip,port,heartbeat,(m_io_service)));

client_queue.at(i)->m_psocket->start();

}boost::thread t(boost::bind(&boost::asio::io_service::run,boost::ref(m_io_service)));

多執行緒呼叫run方式

int thread_count=(std::max)(static_cast(boost::thread::hardware_concurrency()),1);//至少有乙個執行緒執行

boost::thread_group tg;

for (int i=0;istart_send();

伺服器壓力測試心得

最近完成了乙個伺服器框架,於是測試的他的qps,發現了乙個奇怪的問題,測試出來qps只有3w s,與前面說的10w s,有很大的差距。使用trace命令列印出glibc函式呼叫資訊,發現了大部分的時間程式處於鎖等待狀態,我開始懷疑認為是內部使用鎖占用太多時間。於是乎改為無鎖佇列。關於無鎖佇列已經記錄...

後端伺服器的壓力測試

比如我要測試伺服器的連線數最大能達到多少?以前測試的方法是乙個客戶端開啟n個執行緒 n 1000 或者2000,3000 但是並沒有達到測試的效果。做過一些測試,基本方法是啟動乙個客戶端,通過多個執行緒來同時來連線客戶端,乙個執行緒相當於乙個客戶端連線,執行緒數量是可控制的,設定引數一般為 100,...

測試web伺服器的壓力測試程式

以下 是自己寫的乙個測試web伺服器的壓力測試程式,採用epoll多路分發模型,雖然是單執行緒但可以產生足夠的壓力。感興趣的同學可以修改一下測試自己的伺服器程式。include include include include include include include include inclu...