为什么服务器写入的磁盘比读取的磁盘多得多

为什么服务器写入的磁盘比读取的磁盘多得多

我正在运行一个 Ruby on Rails 应用程序,我使用 Passenger Nginx、Ruby on Rails 3.2、搜索 gem Sunspot(使用 Solr 作为其搜索引擎)。我的应用程序在大约 6K 活跃用户的情况下运行正常,但当流量激增(例如 15K 活跃用户)时,其速度慢得令人无法接受。我检查了 newrelic 日志并查看了 I/O 利用率,但我不明白。

这是当流量较低的时候

您可以看到“写入”比“读取”多得多。我不明白这一点,因为大多数用户都在使用 GET 请求,我猜这与读取操作有关。

答案1

如果你的问题与日志写入有关(按照 David 的建议),那么在较新的 nginx 中,通过启用缓冲,可以轻松解决这个问题。access_log写入并使用即时 gzip 压缩(连同缓冲),或者,使用像 zfs 这样的文件系统可以在无需您参与的情况下自动执行其中一些操作。

access_log /path/to/log.gz combined gzip flush=5m;

或者,您的问题可能与 nginx 缓存的工作方式有关(具体而言,默认的proxy_buffering on;等等)。

Nginx 通过文件系统进行缓存,因此它可能对磁盘进行各种写入(这些写入可能会或可能不会显示为读取,因为根据实验的方法,在写入之后的读取很可能是由内存提供的)。

根据您的资源,您可以考虑设置一个基于内存的磁盘作为目录来缓冲您的内容。否则,您也可以考虑设置在你的 nginx 前面 — varnish 通过虚拟内存子系统完成所有的缓存。

答案2

大多数 GET 请求都通过内存处理。但是,写入日志可能会导致 I/O,因为日志通常是行缓冲的,并且每个日志条目通常都是一行。

相关内容