在树莓派2上Nginx并发1W到底有多难

Published by 煎鱼 on

道听途说后的感想

总能得知Nginx的最大并发量能去到10W!简直吓到我,也不知道是我弱鸡还是我没弄过,反正10W的并发量我是没有弄过出来。不过嘛,说不定一台好CPU、大内存、高IO、高优化的服务器随便就可以上十万了,怎么说也是XEON的CPU然后来个几百几十G的内存是吧。那么在性能那么低的树莓派上并发量又能去到多少呢?网友总会说用树莓派当服务器还是算了吧,就这烂性能。这我也深有体会,在上面搭建的MC服务器简直没法玩啊!好吧,毕竟只是个值一两百块钱的板子而已:

  • CPU:4核,性能大概只相当于196MHZ的i3(网友反映的)
  • 内存:1G,简直不够用好吧!
  • 硬盘IO:十几M每秒吧,其实就是SD卡的IO

你看看这性能:
1.根本不能指望SD的IO能干嘛,换句话来说,传统数据库的读写、SWAP的换出换入等和外存有关的都不能实现(这样会拖时间而且换入换出的时候CPU根本承受不了!)
2.因为上面的原因,几乎所有的东西都得堆在内存,1G的内存
3.CPU很low,超频了也不过是零点几、零点零几的提升,如果还不用多线程榨干它简直大逆不道

其实看到这配置估计就有很多人会说:欸,你这不是傻嘛,这么点可怜的性能怎么提升也不可能有什么效果的,还不如去用真·服务器去。其实我主要是不太想这个东西积尘了,也想折腾一下这方面的而已。

除掉Raspbian的限制

修改最大连接数 somaxconn

echo 50000 > /proc/sys/net/core/somaxconn

加快tcp连接的回收

echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

tcp重用

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 

修改成不做洪水抵遇

echo 0 > /proc/sys/net/ipv4/tcp_syncookies

修改系统的打开文件数的限制

ulimit -n 50000

直接用脚本一次性写入即可(毕竟我更喜欢做个懒人)

p.s.其实上面的那个50000是有点夸张而已,树莓派那么低的性能。。

当然还有很多各种各样的参数,我也不做详细解读,例如:
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024    61000
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
net.core.netdev_max_backlog = 8096
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn.backlog=1024
参数值可以忽略。

修改Nginx的配置

这一步本来是最重要的,但是由于性能的原因,也就只能尽量了。

修改worker_processes并绑定CPU

尽量地多线程处理请求,并且在低性能CPU中一个worker绑定一个CPU,将切换worker的资源消耗最小化:

修改worker_rlimit_nofile配置

也就是修改nginx的最高打开文件数

修改worker_connections

修改Nginx的每个worker的最大连接数

负载均衡的上游服务器

开8个,用Python的Tornado(如果要连Tomcat的话,要自己调好参数,不然会拒绝大部分请求的,而且还有控制好tomcat不断飙升的占用内存,树莓派的1G承受不住!)

后台搭建

已经说过了用Python的Tornado做后台,直接就可以用它的demo中的blog来测试,选用blog原因如下:
– 具有前端模板的渲染
– 具有后台数据的提取
– 具有登录鉴权系统

这样的后台,虽然小并且简陋,但是与大部分实际应用相类似,因此选用。而且也特意不用缓存,这样子直接测它的性能。blog大概就是这个样子的:(其实挺丑的,测试数据请忽略)

使用ApacheBench测试

接下来就是使用ab测试了,而且是用树莓派本身来发出请求测试,这样可以忽略网络的作用(其实是因为我手头上没有linux设备,Mac测试浮动太大- -)。

ab -c 8000 -n 50000  http://127.0.0.1/
(根本不敢用1万的并发量好吧!)

结果如图:

可以看出来:
– 5万请求中有一千多的失败(对于这样的“服务器”已经很好了!!)
– 用时好慢
– 看到Processing和Waiting的时间直接人都崩溃了好吗

可以看得出来树莓派不能干这事(怎么感觉只是在自己打自己脸而已),别说1万,8000或者5000都难,所以就不要用树莓派来做服务器啦~(搭建集群的土豪请忽略)

若有错误之处请指出,更多地关注煎鱼

Categories: Raspberry

发表评论

电子邮件地址不会被公开。 必填项已用*标注