php-fpm7.1 mmap/munmap(非常)在虚拟化系统上性能低下(hugepage)

标签 php c performance mmap huge-pages

我的 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/

相关文章:

c++ - 如何强制 C++ 编译器使用寄存器?

php - 我如何在php中格式化时间

php - 如何将 HTTP_POST_RAW_DATA 转换为图像?

c - 使用 Open-MP 的多核进行并行计算。

c - 这种类型的 C 语句叫什么?

c - 实现并行算法来计算 pi

javascript - 在 HTML Treeview 中拉伸(stretch)节点的性能不佳

php - 如何判断保存操作是插入还是更新?

带有 mod_fcgid 的 php5 导致 500 错误 - 可能是错误的权限

iphone - 就速度而言,Sencha Touch + PhoneGap 与 native 应用程序相比表现如何?