7

我的 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 脚本一直在做 mmap/munmap

编辑:我试图启用大页面https://wiki.debian.org/Hugepages Acat /proc/meminfo | grep Huge给了我

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/上没有关于大页面的文档

4

3 回答 3

2

我不是 100% 确定我们是否在这里面临同样的问题,但这是我在为我的问题搜索 Stack Overflow 时能找到的最接近的东西。

我的发现是在具有以下规格的虚拟机上进行的。

CPU : 16

内存:16GB

操作系统:Ubuntu 16.04.4 LTS

容器:LXD 和使用块设备的 ZFS 文件系统

PHP版本:7.1

我正在运行一些运行 MariaDB、Nginx 和 PHP-FPM 7.1 的 LXD 容器。这些是开发环境,所以我只是访问服务器的流量。运行的应用程序是使用 Symfony 框架构建的。

我注意到页面加载时间非常慢。我会一直等待一分钟,让页面以开发模式加载。我也没有花太多时间来确认这一点,但 CLI 脚本也感觉很慢。我尝试调整各种 PHP 设置(realpath 缓存、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 文件系统也会进行写时复制,所以也许这个问题是相关的?

于 2018-04-04T14:10:55.233 回答
1

当你这样做时,括号中选择的值是什么

cat /sys/kernel/mm/transparent_hugepage/enabled 

确保它要么是 madvise(因为 mmaps 通过 MADV_HUGEPAGE 显式请求透明大页面)或总是。

下一步是看看你的内核是否忙于压缩页面(THP 必须为一个巨大的页面找到 2MB 的连续内存块,如果物理内存是碎片化的,这可能会很困难)。看看数字:

cat /proc/vmstat |grep compact

跑步前后。他们长大了吗?

下一步是捕获进程堆栈的内核部分:

cat /proc/YOUR_PROCESS_PID/stack

其他有用的命令是:

cat /proc/buddyinfo

查看物理内存碎片。查找最后两列。它们是大小为 2MB 和 4MB 的空闲内存块。另一个 :

cat /proc/pagetypeinfo

并寻找不可移动的页块。

于 2017-10-29T12:43:53.857 回答
0

禁用主机上的透明大页面支持对我有用:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

就我而言,在 ZFS 后端的 LXD 容器中运行 composer 时发生了问题。

于 2018-12-31T16:02:06.490 回答