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...