比NGINX更快:nginx-1.15.5 vs mongols-1.2.3


nginx是多進程web服務器的優秀代表。

本文要用mongols-1.2.3實現一個比nginx更快的多進程的web服務器。

mongols是C++ 服務器基礎設施庫, 它的主要特性如下:

  • tcp 服務器
  • http 服務器
  • websocket 服務器
  • web 服務器
  • leveldb 服務器
  • lua 服務器
  • sqlite 服務器
  • medis 服務器

以上所有服務器均通過epoll機制實現,並且支持多線程化和多進程化。

mongols不依賴於任何事件庫,其並發性能卻強於著名的libevent、libev和libuv。

而且,它提供非常友好的開發接口,使得任何試圖基於tcp、resp或http協議開發高性能網絡服務器的開發者都能夠輕易地完成工作。

下載:https://github.com/webcpp/mongols

先看壓測比較:

 

再看代碼:

 1 #include <unistd.h>
 2 #include <sys/wait.h>
 3 #include <sys/signal.h>
 4 #include <mongols/util.hpp>
 5 #include <mongols/web_server.hpp>
 6 #include <iostream>
 7 
 8 
 9 static void signal_cb(int sig, siginfo_t *, void *);
10 static std::vector<pid_t> pids;
11 
12 int main(int, char**) {
13     //    daemon(1, 0);
14     auto f = [](const mongols::request & req) {
15         if (req.method == "GET" && req.uri.find("..") == std::string::npos) {
16             return true;
17         }
18         return false;
19     };
20     int port = 9090;
21     const char* host = "127.0.0.1";
22     mongols::web_server
23     server(host, port, 5000, 512000, 0/*must be 0*/);
24     server.set_root_path("html");
25     server.set_mime_type_file("html/mime.conf");
26     server.set_list_directory(true);
27     server.set_enable_mmap(false);
28 
29 
30     int child_process_len = std::thread::hardware_concurrency();
31     mongols::forker(child_process_len
32             , [&]() {
33                 server.run(f);
34             }
35     , pids);
36     for (int i = 0; i < child_process_len; ++i) {
37         mongols::process_bind_cpu(pids[i], i);
38     }
39 
40     const int sig_len = 4;
41     int sigs[sig_len] = {SIGHUP, SIGTERM, SIGINT, SIGQUIT};
42     struct sigaction act;
43     memset(&act, 0, sizeof (struct sigaction));
44     sigemptyset(&act.sa_mask);
45     act.sa_sigaction = signal_cb;
46 
47     for (int i = 0; i < sig_len; ++i) {
48         if (sigaction(sigs[i], &act, NULL) < 0) {
49             perror("sigaction error");
50             return -1;
51         }
52     }
53 
54 
55 
56     for (size_t i=0;i<pids.size();++i) {
57         pid_t pid;
58         if ((pid = wait(NULL)) > 0) {
59 
60         }
61     }
62     
63 }
64 
65 static void signal_cb(int sig, siginfo_t *, void * ) {
66     switch (sig) {
67         case SIGTERM:
68         case SIGHUP:
69         case SIGQUIT:
70         case SIGINT:
71             for (auto & i : pids) {
72                 kill(i, SIGTERM);
73             }
74             break;
75         default:break;
76     }
77 }

 

結論:nginx並不是最快的web服務器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM