比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机制实现,并且支持多线程化和多进程化。

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服务器。

 

目录
相关文章
|
数据采集 机器学习/深度学习 人工智能
Python简直是万能的,这5大主要用途你一定要知道!
Python简直是万能的,这5大主要用途你一定要知道!
960 0
|
索引 存储 数据库
数据库设计规范
基于阿里数据库设计规范扩展而来
49204 4
|
11月前
|
算法 Linux 开发者
Linux内核中的锁机制:保障并发控制的艺术####
本文深入探讨了Linux操作系统内核中实现的多种锁机制,包括自旋锁、互斥锁、读写锁等,旨在揭示这些同步原语如何高效地解决资源竞争问题,保证系统的稳定性和性能。通过分析不同锁机制的工作原理及应用场景,本文为开发者提供了在高并发环境下进行有效并发控制的实用指南。 ####
|
10月前
|
人工智能 并行计算 程序员
【AI系统】SIMD & SIMT 与芯片架构
本文深入解析了SIMD(单指令多数据)与SIMT(单指令多线程)的计算本质及其在AI芯片中的应用,特别是NVIDIA CUDA如何实现这两种计算模式。SIMD通过单指令对多个数据进行操作,提高数据并行处理能力;而SIMT则在GPU上实现了多线程并行,每个线程独立执行相同指令,增强了灵活性和性能。文章详细探讨了两者的硬件结构、编程模型及硬件执行模型的区别与联系,为理解现代AI计算架构提供了理论基础。
1327 12
|
Shell 开发者 C++
`mypy` 是一个Python的静态类型检查器,它可以在不运行代码的情况下发现潜在的类型错误。
`mypy` 是一个Python的静态类型检查器,它可以在不运行代码的情况下发现潜在的类型错误。
|
测试技术 C语言
分享一个好用的C语言.ini文件的解析库
分享一个好用的C语言.ini文件的解析库
725 0
|
Ubuntu 数据库 C++
百度搜索:蓝易云【【嵌入式Qt开发入门】在Ubuntu下编写C++教程。】
请注意,这只是一个入门教程,Qt开发涉及到更广泛的主题和概念,例如信号与槽机制、界面设计、数据库操作等。建议参考Qt官方文档和教程,以深入了解和掌握嵌入式Qt开发。
286 0
|
算法 编译器 API
【CMake的文件操作】深入CMake的文件操作:精通遍历及高级应用
【CMake的文件操作】深入CMake的文件操作:精通遍历及高级应用
479 1
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
1407 1
|
缓存 网络协议 Linux
零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(下)
本章节主要讨论了如何通过零拷贝技术来优化文件传输的性能。零拷贝技术主要通过减少用户态和内核态之间的上下文切换次数和数据拷贝次数来提高性能。具体来说,介绍了两种实现零拷贝的方式:mmap + write和sendfile。使用mmap + write可以减少一次数据拷贝过程,而使用sendfile系统调用可以进一步减少系统调用和数据拷贝次数。此外,还介绍了如果网卡支持SG-DMA技术,可以通过DMA将数据直接拷贝到网卡缓冲区,实现真正的零拷贝。通过这些优化方法,可以显著提高文件传输的性能。
570 0
零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(下)