当网络流量很大时,我遇到了服务器负载过高的问题(平均负载从 10 到 100+)。读取/写入文件时也会出现明显的延迟。机器是 Apache 网络服务器。网页使用 PHP 并访问/打开一些小文件(最大 30kB)(配置、黑名单、缓存目录中的文件)。
这几天我一直在尝试追查这个问题的根源。以下是我发现的:
- CPU 负载低于 10%
- 负载是由长磁盘响应引起的。
top
显示%wa
参数(iowait)为20-100% - iostat:粘贴箱
- 经过一些测试后,问题似乎出在我的 PHP 脚本中的一个特定的 fopen() 函数上,该函数访问了缓存文件
- 如果我删除包含此特定 fopen() 的行,服务器负载将快速下降,降至 0.00-0.50 值,iowait 为 0%
有关服务器的一些信息:
- xeon e3-1245v2、32 GB RAM、2 个 2TB SATA3 驱动器(带软件 RAID 1(镜像)、文件系统 ext4(
dir-index
已启用并noatime
位于 fstab 中) - 缓存目录大小约为 500GB
- 它有大约 1600-1700 万个文件,每个文件 20-30KB
- 文件名是 MD5 哈希值
- 目录结构为(示例):
cacheDir/d4/1d/d41d8cd98f00b204e9800998ecf8427e.dat
- 因此,第一级目录中有 256 个目录
cacheDir/
,每个第一级目录中有 256 个第二级目录 - 因此,平均每个二级目录大约有 200-300 个文件
- PHP 正在
fopen
使用绝对路径缓存文件 - 检查磁盘:无错误/警告
e2fsck -Df
(优化文件系统中的目录)结果是这里e2fsck -Df
服务器负载没有变化后
我以为,这样的缓存目录组织有利于实现最佳磁盘性能。显然我错了。
您建议采取什么措施来解决这个高负载/磁盘响应缓慢的问题?