Linux:不要使用目录下的文件系统缓存

Linux:不要使用目录下的文件系统缓存

对于我正在监控的 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>

相关内容