比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服务器。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CNN-RNN中文文本分类,基于TensorFlow 实现
使用卷积神经网络以及循环神经网络进行中文文本分类 CNN做句子分类的论文可以参看: https://arxiv.org/abs/1408.5882 还可以去读dennybritz大牛的博客: http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/ 以及字符级CNN的论文: https://arxiv.org/abs/1509.01626 本文是基于TensorFlow在中文数据集上的简化实现,使用了字符级CNN和RNN对中文文本进行分类,达到了较好的效果。 使用THUCNews的一个子集进行训练与测试,数据集请自行到THUCTC:一个高效的中文文本分类工具包 下载,请遵循数据提供方的开源协议。 本次训练使用了其中的10个分类,每个分类6500条数据。 类别如下: 体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐 数据集划分如下: ●训练集: 5000*10 ●验证集: 500*10 ●测试集: 1000*10 从原数据集生成子集的过程请参看...
- 下一篇
.Net并行编程(一)-TPL之数据并行
前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程。利用硬件的特性,使用并行化代码以在多个处理器之间分配工作。 应用场景 文件批量上传 并行上传单个文件。也可以把一个文件拆成几段分开上传,加快上传速度。 数据分批计算 如几百万数据可以拆成许多无关联的部分,并行计算处理。最后聚合。 数据推送 也是需要将数据拆解后,并行推送。 任务并行库-数据并行 如果在一个循环内在每次迭代只执行少量工作或者它没有运行多次迭代,那么并行化的开销可能会导致代码运行的更慢。使用并行之前,应该对线程(锁,死锁,竞争条件)应该有基本的了解。 Parallel.For /// <summary> /// 正常循环 /// </summary> public void FormalDirRun() { long totalSize = 0; var dir = @"E:\LearnWall\orleans";//args[1]; String[] files = Directory.GetFiles(dir); stopwatch.Restart(); for (var i ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群