我的 php-fpm 进程在 Ubuntu 14.04 LTS(Nginx 服务器,MariaDB 数据库)上面临性能问题。
strace -f $(pidof php-fpm7.1 | sed 's/\([0-9]*\)/\-p \1/g')
给我
<... epoll_wait resumed> {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 103) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933fdd000
[pid 32535] munmap(0x7fd933fdd000, 2097152) = 0
[pid 32535] mmap(NULL, 4190208, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933dde000
[pid 32535] munmap(0x7fd933dde000, 139264) = 0
[pid 32535] munmap(0x7fd934000000, 1953792) = 0
[pid 32535] madvise(0x7fd933e00000, 2097152, MADV_HUGEPAGE) = 0
[pid 32533] <... epoll_wait resumed> {}, 1, 897) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933c00000
[pid 32535] madvise(0x7fd933c00000, 2097152, MADV_HUGEPAGE) = 0
[pid 32533] <... epoll_wait resumed> {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933a00000
[pid 32535] madvise(0x7fd933a00000, 2097152, MADV_HUGEPAGE) = 0
[pid 32533] <... epoll_wait resumed> {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] open("/usr/share/zoneinfo/UTC", O_RDONLY) = 7
[pid 32535] fstat(7, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
[pid 32535] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20) = 20
[pid 32535] lseek(7, 0, SEEK_SET) = 0
[pid 32535] mmap(NULL, 118, PROT_READ, MAP_SHARED, 7, 0) = 0x7fd946835000
[pid 32535] close(7) = 0
[pid 32535] munmap(0x7fd946835000, 118) = 0
[pid 32535] pwrite(5, "_sf2_attributes|a:2:{s:14:\"_secu"..., 979, 0) = 979
[pid 32535] close(5) = 0
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933200000
[pid 32535] madvise(0x7fd933200000, 2097152, MADV_HUGEPAGE) = 0
我尝试使用 php-fpm7.0、PHPMod7.1 但同样的问题。
对于数据量较小的请求,CPU 占用率高达 100%。
配置是默认的。
在重复的实例上 php5.6-fpm 运行良好。
编辑:可能相关PHP script keeps doing mmap/munmap
编辑:我尝试启用大页面 https://wiki.debian.org/Hugepages
cat/proc/meminfo | grep 巨大的
给了我
AnonHugePages: 108544 kB
HugePages_Total: 512
HugePages_Free: 497
HugePages_Rsvd: 50
HugePages_Surp: 0
Hugepagesize: 2048 kB
还是一样的问题。
编辑:我尝试启用/禁用 OPCache,还设置了 opcache.huge_code_pages=0
,但没有结果。 http://php.net/ 上没有关于大页面的文档
最佳答案
我不是 100% 确定我们是否在这里面临同样的问题,但这是我在 Stack Overflow 中搜索我的问题时能找到的最接近的东西。
我的发现是在具有以下规范的虚拟机上。
CPU:16
内存:16GB
操作系统:Ubuntu 16.04.4 LTS
容器:使用 block 设备的 ZFS 文件系统的 LXD
PHP 版本:7.1
我正在运行一些运行 MariaDB、Nginx 和 PHP-FPM 7.1 的 LXD 容器。这些是开发环境,所以我只是访问服务器的流量。运行的应用程序是使用 Symfony 框架构建的。
我注意到页面加载时间非常慢。我会一直等待一分钟以上,让页面以开发模式加载。我也没有花那么多时间来确认这一点,但 CLI 脚本也感觉很慢。我尝试调整各种 PHP 设置(真实路径缓存、opcache 开/关/各种设置等)但没有任何效果。
我可以始终跟踪其中一个 PHP-FPM 进程,并看到一个系统调用似乎很慢。所有其他调用都会轻而易举地过去,但在整个过程的生命周期中,它多次卡在以下调用上。
madvise(0x7f4dcca00000, 2097152, MADV_HUGEPAGE) = 0
长话短说,我能够通过禁用 THP 来彻底改变此应用程序的性能。我在 LXD 主机上运行了以下命令,页面加载时间像白天和黑夜一样变化。
sysctl -w vm.nr_hugepages=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
我知道 Redis 建议禁用 THP,因为与写时复制相关的性能问题。我也知道 ZFS 文件系统也进行写时复制,所以也许这个问题是相关的?
关于php-fpm7.1 mmap/munmap(非常)在虚拟化系统上性能低下(hugepage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013646/