mongols C++ 服务器基础设施 项目简介
mongols一个C++库依赖:linuxpcre-develhiredis-develzlib-developenssl-develcurl-develsudo yum install pcre-devel zlib-devel openssl-devel hiredis-devel libcurl-devel或者:sudo apt-get install libpcre3-dev zlib1g-dev libssl-dev libhiredis-dev libcurl4-openssl-dev特性:epoll or epoll + multi-threadingtcp severhttp serverwebsocket serverweb serverleveldb serverlua serversqlite serverutils安装:make clean && make -j2 && sudo make install && sudo ldconfig使用:pkg-config --libs --cflags mongols例子:#include<mongols/tcp_server.hpp>#include<mongols/tcp_threading_server.hpp>#include<mongols/http_server.hpp>#include<mongols/ws_server.hpp>#include<mongols/web_server.hpp>#include<mongols/leveldb_server.hpp>#include<mongols/util.hpp>#include/*
//websocket server
int main(int,char**){
int port=9090;
const char* host="127.0.0.1";
mongols::ws_server server(host,port,5000,2048,4);
auto f=[](const std::string& input
, bool& keepalive
, bool& send_to_other
, mongols::tcp_server::client_t& client
, mongols::tcp_server::filter_handler_function& send_to_other_filter){
keepalive = KEEPALIVE_CONNECTION;
send_to_other=true;
if(input=="close"){
keepalive = CLOSE_CONNECTION;
send_to_other = false;
}
};
server.run(f);
//server.run();
}
*/
/*
//tcp server or tcp multi-threading server
int main(int,char**)
{
auto f=[](const std::string& input
, bool & keepalive
, bool& send_to_other
, mongols::tcp_server::client_t& client
, mongols::tcp_server::filter_handler_function& send_to_other_filter){
keepalive= KEEPALIVE_CONNECTION;
send_to_other=true;
return input;
};
int port=9090;
const char* host="127.0.0.1";
//mongols::tcp_threading_server
mongols::tcp_server
server(host,port);
server.run(f);
}
*/
//http server or multi-threading server
int main(int,char**)
{
auto f=[](const mongols::request&){
return true;
};
auto g=[](const mongols::request& req,mongols::response& res){
//std::unordered_map::const_iterator i;
//if((i=req.session.find("test"))!=req.session.end()){
//long test=std::stol(i->second)+1;
//res.content=std::to_string(test);
//res.session["test"]=res.content;
//}else{
//res.content=std::to_string(0);;
//res.session["test"]=res.content;
//}
res.content=std::move("hello,world");
res.status=200;
};
int port=9090;
const char* host="127.0.0.1";
mongols::http_server
//server(host,port,5000,1024,4);
server(host,port);
server.set_enable_session(false);
server.set_enable_cache(false);
server.run(f,g);
}
/*
//web server or multi-threading server
int main(int,char**)
{
auto f=[](const mongols::request&){
if(req.method=="GET"&&req.uri.find("..")==std::string::npos){
return true;
}
return false;
};
int port=9090;
const char* host="127.0.0.1";
mongols::web_server
//server(host,port,5000,1024,4);
server(host,port);
server.set_root_path("html");
server.set_mime_type_file("mime.conf");
server.set_list_directory(true);
server.run(f);
}
*/
/*
//leveldb_server or multi-threading server
int main(int,char**){
int port=9090;
const char* host="127.0.0.1";
mongols::leveldb_server
//server(host,port,5000,1024,4);
server(host,port);
server.run("html/leveldb");
}
*/压力测试:[centos@localhost demo]$ uname -a
Linux localhost 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[centos@localhost demo]$ cat /proc/cpuinfo| grep "processor"| wc -l
4
[centos@localhost demo]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores: 2
[centos@localhost demo]$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1ab -c1000 -n100000 http://127.0.0.1:9090/Server Software: mongols/0.9.0
Server Hostname: 127.0.0.1
Server Port: 9090
Document Path: /
Document Length: 13 bytes
Concurrency Level: 1000
Time taken for tests: 8.180 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 0
Total transferred: 13300000 bytes
HTML transferred: 1300000 bytes
Requests per second: 12225.00 [#/sec] (mean)
Time per request: 81.800 [ms] (mean)
Time per request: 0.082 [ms] (mean, across all concurrent requests)
Transfer rate: 1587.82 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 66 263.3 7 3020
Processing: 2 11 11.9 9 831
Waiting: 0 8 11.5 7 829
Total: 6 77 265.8 16 3033
Percentage of the requests served within a certain time (ms)
50% 16
66% 20
75% 22
80% 23
90% 29
95% 1017
98% 1025
99% 1030
100% 3033 (longest request)ab -kc1000 -n100000 -H'Connection: keep-alive' http://127.0.0.1:9090/Server Software: mongols/0.9.0
Server Hostname: 127.0.0.1
Server Port: 9090
Document Path: /
Document Length: 13 bytes
Concurrency Level: 1000
Time taken for tests: 1.935 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 100000
Total transferred: 13800000 bytes
HTML transferred: 1300000 bytes
Requests per second: 51671.74 [#/sec] (mean)
Time per request: 19.353 [ms] (mean)
Time per request: 0.019 [ms] (mean, across all concurrent requests)
Transfer rate: 6963.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 3.2 0 48
Processing: 8 19 1.4 18 48
Waiting: 0 19 1.4 18 25
Total: 8 19 3.1 18 64
Percentage of the requests served within a certain time (ms)
50% 18
66% 19
75% 19
80% 19
90% 20
95% 21
98% 23
99% 28
100% 64 (longest request)
//websocket server
int main(int,char**){
int port=9090;
const char* host="127.0.0.1";
mongols::ws_server server(host,port,5000,2048,4);
auto f=[](const std::string& input
, bool& keepalive
, bool& send_to_other
, mongols::tcp_server::client_t& client
, mongols::tcp_server::filter_handler_function& send_to_other_filter){
keepalive = KEEPALIVE_CONNECTION;
send_to_other=true;
if(input=="close"){
keepalive = CLOSE_CONNECTION;
send_to_other = false;
}
};
server.run(f);
//server.run();
}
*/
/*
//tcp server or tcp multi-threading server
int main(int,char**)
{
auto f=[](const std::string& input
, bool & keepalive
, bool& send_to_other
, mongols::tcp_server::client_t& client
, mongols::tcp_server::filter_handler_function& send_to_other_filter){
keepalive= KEEPALIVE_CONNECTION;
send_to_other=true;
return input;
};
int port=9090;
const char* host="127.0.0.1";
//mongols::tcp_threading_server
mongols::tcp_server
server(host,port);
server.run(f);
}
*/
//http server or multi-threading server
int main(int,char**)
{
auto f=[](const mongols::request&){
return true;
};
auto g=[](const mongols::request& req,mongols::response& res){
//std::unordered_map::const_iterator i;
//if((i=req.session.find("test"))!=req.session.end()){
//long test=std::stol(i->second)+1;
//res.content=std::to_string(test);
//res.session["test"]=res.content;
//}else{
//res.content=std::to_string(0);;
//res.session["test"]=res.content;
//}
res.content=std::move("hello,world");
res.status=200;
};
int port=9090;
const char* host="127.0.0.1";
mongols::http_server
//server(host,port,5000,1024,4);
server(host,port);
server.set_enable_session(false);
server.set_enable_cache(false);
server.run(f,g);
}
/*
//web server or multi-threading server
int main(int,char**)
{
auto f=[](const mongols::request&){
if(req.method=="GET"&&req.uri.find("..")==std::string::npos){
return true;
}
return false;
};
int port=9090;
const char* host="127.0.0.1";
mongols::web_server
//server(host,port,5000,1024,4);
server(host,port);
server.set_root_path("html");
server.set_mime_type_file("mime.conf");
server.set_list_directory(true);
server.run(f);
}
*/
/*
//leveldb_server or multi-threading server
int main(int,char**){
int port=9090;
const char* host="127.0.0.1";
mongols::leveldb_server
//server(host,port,5000,1024,4);
server(host,port);
server.run("html/leveldb");
}
*/压力测试:[centos@localhost demo]$ uname -a
Linux localhost 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[centos@localhost demo]$ cat /proc/cpuinfo| grep "processor"| wc -l
4
[centos@localhost demo]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores: 2
[centos@localhost demo]$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1ab -c1000 -n100000 http://127.0.0.1:9090/Server Software: mongols/0.9.0
Server Hostname: 127.0.0.1
Server Port: 9090
Document Path: /
Document Length: 13 bytes
Concurrency Level: 1000
Time taken for tests: 8.180 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 0
Total transferred: 13300000 bytes
HTML transferred: 1300000 bytes
Requests per second: 12225.00 [#/sec] (mean)
Time per request: 81.800 [ms] (mean)
Time per request: 0.082 [ms] (mean, across all concurrent requests)
Transfer rate: 1587.82 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 66 263.3 7 3020
Processing: 2 11 11.9 9 831
Waiting: 0 8 11.5 7 829
Total: 6 77 265.8 16 3033
Percentage of the requests served within a certain time (ms)
50% 16
66% 20
75% 22
80% 23
90% 29
95% 1017
98% 1025
99% 1030
100% 3033 (longest request)ab -kc1000 -n100000 -H'Connection: keep-alive' http://127.0.0.1:9090/Server Software: mongols/0.9.0
Server Hostname: 127.0.0.1
Server Port: 9090
Document Path: /
Document Length: 13 bytes
Concurrency Level: 1000
Time taken for tests: 1.935 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 100000
Total transferred: 13800000 bytes
HTML transferred: 1300000 bytes
Requests per second: 51671.74 [#/sec] (mean)
Time per request: 19.353 [ms] (mean)
Time per request: 0.019 [ms] (mean, across all concurrent requests)
Transfer rate: 6963.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 3.2 0 48
Processing: 8 19 1.4 18 48
Waiting: 0 19 1.4 18 25
Total: 8 19 3.1 18 64
Percentage of the requests served within a certain time (ms)
50% 18
66% 19
75% 19
80% 19
90% 20
95% 21
98% 23
99% 28
100% 64 (longest request)