Nginx性能改进一例

开发 前端
本文研究的是在海量静态文件下,如何提高nginx的处理能力。在静态文件数量不是很多的情况下,nginx处理静态文件的能力极快,但是在海量的静态文件下,nginx的处理能力就不那么乐观,怎么提高nginx处理能力呢……

本文研究的是在海量静态文件下,如何提高nginx的处理能力。在静态文件数量不是很多的情况下,nginx处理静态文件的能力极快,但是在海量的静态文件下,nginx的处理能力就不那么乐观,怎么提高nginx处理能力呢,当然从系统角度,可以mount时对文件系统加noatime,以及采用目录hash,再结合url rewrite等方式,可以适当的提高点性能,我这里介绍的是,通过将静态文件存在leveldb的方式。

先说一下测试的环境,戴尔R710普通服务器,7200转的普通硬盘,没有做raid。拿了55万张图片,41G去尽可能模拟海量图片的情形,当然这个量级与一般公司的量级还差的太远,这里只测试,压力工具用siege。

  1. 命令:siege -c 100 -b -i -r 100 -f /tmp/urlll 

文件系统下nginx压力测试:

这个能力会让我们对nginx很失望,每秒约处理163个请求,平均每个请求耗时0.6s,吞吐不到12MB。问题不再于nginx,在于系统文件系统的io瓶颈,linux文件系统基于树状设计,加上硬盘本身的缺陷,使得文件系统的随机io不高,当文件数量不多,加上系统的cache,感觉不明显,但文件数量上一个量级,文件系统的io将迅速成为系统中***的瓶颈。

怎样去弥补文件系统自身的io不足,提高nginx的静态处理能力,我一直在思考这个问题,现在nosql很火,我一直设想如是将数据全部存在 nosql里面,避免通过文件系统去查找文件,是否会提高nginx的处理能力呢,我把上面测试的41G的558397图片全部存入google的 leveldb中,编写一个nginx的leveldb模块,让nginx请求直接去查询leveldb,再用上面同样的方式去随机测试,得到如下数据。

leveldb下nginx压力测试:

与上面的性能数据相比,每秒的处理能力由163提高到了380,平均每个request耗时由0.6s降到了0.25s,吞吐由12MB提高到了27MB。总体至少提高了近2~3倍的处理能力。如果数据量级更大的话,我估计性能提升的倍数更高。

我把我编写的nginx模块的hander部分贴出来,没有做任何优化和请求头过滤。

编译确保nginx正常链接到leveldb

有兴趣的朋友可以继续研究有没有更好的方法,欢迎交流。

补充一下采用目录hash+url rewrite的测试结果,回答一下下面一个热心朋友的疑问。在这里北游谢谢热心的朋友参与和讨论,我将保证每个人的提问我都必回,谈谈我的看法,也听听别人的看法,希望以此认识更多的朋友,共同成长。在这里要感谢开源中国社区给我们提供了一个这样的交流讨论平台。

我这里图片的命名,都是数字组成,为了让每个目录尽可能的分配均匀,我这里分二级目录去hash,***级用文件名的第2位和第3位组成,第二级目录名用第4位第5位第6位组成,这样分成2层目录,***层100个目录,第2层1000个目录,平均每个目录约55个文件。

先准备环境,如图:

nginx的rewrite配置如图:

同样用bin/siege -c 100 -b -i -r 100 -f /tmp/urlll,测试结果如下:

 

数据我就不分析说了,与leveldb方式差距太大了。

原文链接:http://my.oschina.net/beiyou/blog/79646

责任编辑:林师授 来源: OsChina.NET
相关推荐

2012-05-17 09:26:43

MapReduce

2009-07-16 13:03:05

ibatis resu

2021-07-06 12:07:27

Go 服务性能

2009-12-01 09:15:30

Windows 7系统激活

2009-03-17 08:40:44

Windows 7微软改进

2014-11-19 09:22:48

云计算Dockerpython API

2022-12-28 11:35:20

Linux 6.3RSEQ

2009-05-27 09:18:06

VSTS 2010服务层SQL Server

2009-08-07 09:57:38

2009-03-10 19:16:39

Windows 7新功能

2009-09-17 16:38:02

WSUS服务器

2010-05-11 15:50:56

Fedora 13

2013-11-12 14:43:43

MySQL数据库

2017-01-16 15:43:54

存储虚拟化控制器

2021-03-08 06:29:53

微信僵尸粉移动应用

2013-10-15 09:48:03

C++Lambda函数式编程

2009-08-06 11:37:24

虚拟机NAT连接物理网络

2020-11-10 13:42:07

Go编译器修复

2021-12-03 05:33:16

Windows 11操作系统微软

2024-10-24 08:07:25

大语言模型LLMRAG模型
点赞
收藏

51CTO技术栈公众号