我正在运行一个 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,因为日志通常是行缓冲的,并且每个日志条目通常都是一行。