减less由nginx引起的IO

我有很多可用的RAM,但是我的IO总是100%util或者非常接近。 我可以通过使用更多的RAM来减lessIO的方式? 我的iotop显示最高io率的nginx工作进程。 这是一个文件服务器提供从1MB到2GB的文件。 这是我的nginx.conf

#user nobody; worker_processes 32; worker_rlimit_nofile 10240; worker_rlimit_sigpending 32768; error_log logs/error.log crit; #pid logs/nginx.pid; events { worker_connections 51200; } http { include mime.types; default_type application/octet-stream; access_log off; limit_conn_log_level info; log_format xfs '$arg_id|$arg_usr|$remote_addr|$body_bytes_sent|$status'; sendfile off; tcp_nopush off; tcp_nodelay on; directio 4m; output_buffers 3 512k; reset_timedout_connection on; open_file_cache max=5000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; client_body_buffer_size 32k; server_tokens off; autoindex off; keepalive_timeout 0; #keepalive_timeout 65; 

打开sendfile。 保留output_buffers默认值。 转直接closures。 添加更多的RAM。

没有比Linux VFScaching更好的了。

请不要接受这个答案,因为这只是一个观察。 但是对于4M以上的文件使用直接IO,只允许nginx 1.5MB的文件内存缓冲区。

 directio 4m; output_buffers 3 512k; 

如果我没有记错,那么直接IO基本上绕过了文件系统IOcaching直接从HDD读取。 因此,对于超过4M的文件,您不使用内存来缓冲文件,对于4M以下的文件,只使用1.5M内存。

看起来你想直接从内存提供一些请求 – 这基本上等于caching这些请求。 在其基本forms中,您将处理请求,将副本存储在基于内存的caching中,并为来自内存的相同资源的后续请求提供服务(直到您使caching副本失效/失效为止)。

这将取决于您的网站的性质(即如果您服务的文件非常大,这将不会如实际 – 如果您的内容是高度dynamic的,它不会提供太多的好处,等等) – 但对于一个普通的网站来说,大部分页面的I / O都来自静态资源(特别是图片),这会减less磁盘I / O(并且也会加快速度)。

如果您正在代理到后端服务器,则可以使用nginx的proxy_cache指令来caching页面。 但是,caching位置通常在磁盘上(这可能会加快速度,但可能不会保存在磁盘I / O上) – 您可以通过创build一个映射到内存(即ramdisk)的tmpfs来caching该caching。 同样,如果您正在使用FastCGI,则可以使用fastcgi_cache。

另一个类似的选项(例如,如果你不使用nginx作为代理,而不是使用FastCGI)是将页面存储在MemCached中。 Nginx自带了一个memcached模块,可以让你设置自己的caching机制。

或者,您可以简单地在Nginx前面添加一个caching代理(如Varnish),它将接收请求,并直接提供服务或将请求传递给Nginx。 清漆可以configuration为将其caching存储在内存中(或者文件 – 尽pipe这不会帮助您的I / O),并且会使用最less的磁盘I / O来提供caching命中。

worker_processes 32;

– 你还在猜测为什么?

我有很多可用的RAM,但是

我也想听听关于sendfile off;推理sendfile off; 和使用directio – 我是唯一一个(当然不是¹)谁知道directio(根据定义)禁止FScaching?

Martin F,至less还记得这个: 减lessnginx引起的IO