![Linux:不要使用目录下的文件系统缓存](https://linux22.com/image/597011/Linux%EF%BC%9A%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%BC%93%E5%AD%98.png)
对于我正在监控的 PHP 网站,我需要查看每次浏览器发出请求时正在使用哪些文件。
我想到使用find . -type f -amin 1
。
这样我就可以获得最后一分钟读取的所有文件(这是一个正在开发的服务器,所以只有我在使用该网站)。
我已成功noatime
从挂载点移除该属性。
但是肯定有其他原因阻止内核读取磁盘上的实际文件,因为读取文件时访问时间未更新。
我猜一定是文件系统缓存正在从内存中检索文件。
有没有办法禁用特定目录下的文件缓存?(我的情况是 public_html)
另外,我在某处读到过,nobh
挂载属性显然会禁用该挂载点下的文件缓存,但我不确定。
答案1
为什么不看看 apache 日志?它列出了每个被访问的文件,并带有时间戳以及访问者。
如果必须使用 atime,请注意 stat 系统调用上维基百科页面上的以下内容:
Linux 内核开发人员 Ingo Molnár 称 atime “可能是有史以来最愚蠢的 Unix 设计理念”,并补充道:“想一想:‘对于从磁盘读取的每个文件,我们都要写入磁盘!并且,对于已经缓存并从缓存中读取的每个文件,我们都要写入磁盘!’”他进一步强调了性能影响:
atime 更新是 Linux 目前最大的 I/O 性能缺陷。消除 atime 更新将为我们的日常 Linux 性能带来比过去 10 年所有页面缓存加速更好的性能,合并。
当前版本的Linux支持四个挂载选项,可以在fstab中指定:
strictatime (formerly atime, and formerly the default; strictatime as of 2.6.30) – always update atime
relatime ("relative atime", introduced in 2.6.20 and the default as of 2.6.30) – only update atime under certain circumstances (explained below)
nodiratime – never update atime of directories, but do update atime of other files
noatime – never update atime of any file or directory; implies nodiratime; highest performance, but least compatible
答案2
对于我正在监控的 PHP 网站,我需要查看每次浏览器发出请求时正在使用哪些文件。
除非我遗漏了什么,否则您可以简单地跟踪服务器日志。
对于 Apache:
tail -f /var/log/httpd/access_log
如果 PHP 正在读取浏览器请求中未包含的其他文件(包含之类的),则可以启用审核。
auditctl -w /path/to/watch -p r -k php-access
您只会对 PHP 读取感兴趣。
ausearch -k php-access -ui <uid php uses>