64MB VPS 上优化 Nginx
2009年06月21日 | 标签: nginx, optimisation, Site Reliability | Performance | 作者:vpsee
Nginx 小巧,高效,稳定等优点非常适合配置不高,内存小的 VPS。这里的优化策略不是让nginx每秒能处理更多的请求,那是一个繁忙网站要做的。记住,这是一个只有 64MB 的 VPS,对于架设一个访问量不大的网站/博客来说,尽可能减少 Nginx 的内存占用率是最重要的,用尽量小的 Nginx 占用内存去满足不大的访问量。
优化 nginx.conf
Nginx 运行的进程数,一般设置成和 CPU 的核数相同。
worker_processes 1;
使用 epoll,Linux 内核2.6版本以上支持 epoll(eventport支持 Soaris,kqueue 支持 BSD系列),worker_connections 每个 Nginx 进程所允许的最大的连接数,max_clients = worker_processes * worker_connections。
events { use epoll; worker_connections 128; }
设置连接的超时时间。
keepalive_timeout 5;
Linux内核相关,用 kernel file buffer 直接发送数据给 network interface,不需要另用 buffer 中转,通过调用内核级 sendfile() 来提高性能(Linux kernel的sendfile是如何提高性能的)。tcp_nopush 这个参数只有 sendfile on 的时候才有用。tcp_nodelay 只在 keepalive 连接状态中使用。
sendfile on; tcp_nopush on; tcp_nodelay on;
gzip 压缩方面的参数,分别是:支持 gzip 压缩,回送给客户端最小的 gzip 压缩大小,gzip 压缩缓存,要 gzip 压缩的文件类型,压缩程度,vary header 支持,gzip http 版本默认是1.1,如果前端是 squid2.5 则使用1.0。
gzip on; gzip_min_length 1000; gzip_buffers 4 8k; gzip_types text/* text/css application/javascript application/x-javascript; gzip_comp_level 5; gzip_vary on; gzip_http_version 1.1;
性能测试
ab(Apache Bench)是一个用来测试 Apache HTTP Serve r的工具,主要用来测试 Apache 的性能,尤其是展示 web server 每秒能处理多少次请求。
Debian 下安装 ab:
#apt-get install apache2-utils
开始测试,下面的命令将会打开10个连接并且使用 Keep-Alive,通过这30个连接进行压力测试。不要在 web server 上本机测试,最好用另外一台机器。
#ab -kc 10 -t 30 http://www.example.com/
优化 Nginx 前测试:
Finished 196 requests Server Software: nginx/0.6.32 Server Hostname: www.example.com Server Port: 80 Document Path: / Document Length: 26186 bytes Concurrency Level: 10 Time taken for tests: 30.4440 seconds Complete requests: 196 Failed requests: 195 (Connect: 0, Length: 195, Exceptions: 0) Write errors: 0 Keep-Alive requests: 0 Total transferred: 5172095 bytes HTML transferred: 5128733 bytes Requests per second: 6.53 [#/sec] (mean) Time per request: 1530.839 [ms] (mean) Time per request: 153.084 [ms] (mean, across all concurrent requests) Transfer rate: 168.31 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 46 46 1.8 47 61 Processing: 367 1442 152.0 1432 1718 Waiting: 253 1332 155.3 1323 1615 Total: 414 1488 152.0 1480 1766 Percentage of the requests served within a certain time (ms) 50% 1480 66% 1523 75% 1561 80% 1585 90% 1617 95% 1641 98% 1659 99% 1708 100% 1766 (longest request)
优化后测试:
Finished 187 requests Server Software: nginx/0.6.32 Server Hostname: www.example.com Server Port: 80 Document Path: / Document Length: 26030 bytes Concurrency Level: 10 Time taken for tests: 30.21724 seconds Complete requests: 187 Failed requests: 186 (Connect: 0, Length: 186, Exceptions: 0) Write errors: 0 Keep-Alive requests: 0 Total transferred: 4943176 bytes HTML transferred: 4901785 bytes Requests per second: 6.23 [#/sec] (mean) Time per request: 1605.440 [ms] (mean) Time per request: 160.544 [ms] (mean, across all concurrent requests) Transfer rate: 160.78 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 46 47 2.5 47 71 Processing: 420 1511 300.3 1445 2744 Waiting: 325 1394 283.8 1333 2633 Total: 466 1558 300.6 1492 2794 Percentage of the requests served within a certain time (ms) 50% 1491 66% 1539 75% 1574 80% 1622 90% 1700 95% 2227 98% 2682 99% 2782 100% 2794 (longest request)
结论
粗略看一下上面的数据,可能会发现优化后的性能还下降了,这是为什么呢?主要是因为 gzip on 增加了服务器的负载,需要 CPU/内存去压缩,很大程度影响到了实际性能。从内存使用的角度来说,我们优化的目的达到了,用 top 显示运行优化前的 nginx 占用了 1.54MB 的内存,运行优化后的 nginx 只占用了0.58MB。 节省了内存,牺牲了一点性能。不知道这个算不算优化呢?有的人追求速度,有的人追求节省资源,有的人追求稳定,我们主要看优化的目的是什么,才能根据自己所需进行改良。
对于一个访问量不大的网站/博客来说,每秒能处理的请求数不是太重要,只要这个请求数能应付那点访问量就可以了。对于只有 64MB 的 VPS 来说,要运行的东西太多,php/mysql/wordpress 等都是耗内存大户,这个时候内存资源显得尤为重要,尽可能腾出空间来给这些必须的程序减少程序内存不够导致的频繁 swapping 才能从整体上提高性能。其实硬盘 IO 才是一个 web server 最大的性能瓶颈,这是另外一个话题。
很不错的教程啊。
优化前
Concurrency Level: 10
Time taken for tests: 5.433 seconds
Complete requests: 50000
Keep-Alive requests: 50000
Requests per second: 9202.64 [#/sec] (mean)
Time per request: 1.087 [ms] (mean)
Time per request: 0.109 [ms] (mean, across all concurrent requests)
优化后
Concurrency Level: 10
Time taken for tests: 4.256 seconds
Complete requests: 50000
Requests per second: 11748.30 [#/sec] (mean)
Time per request: 0.851 [ms] (mean)
Time per request: 0.085 [ms] (mean, across all concurrent requests)
牛啊