swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.59k stars 786 forks source link

记录一次线上内存200M的问题排查过程 #1087

Open Jamlee opened 4 years ago

Jamlee commented 4 years ago
Q A
Bug report? no
Feature request? no
Swoft version 2.0.6
Swoole version 4.4.12
PHP version 7.3
Runtime environment Ubuntu/Docker etc.

问题描述 在本地运行、或者其他Ubuntu主机运行是仅使用内存50MB以内,到线上阿里云环境发现使用了200MB内存。内存使用虽然和swoole 的进程数量多少有关,但是线上线下配置是一样,应该是同样的CPU和内存消耗。

排查过程

  1. 经过对比 think-swoole , 在同样swoole版本配置、同个Linux虚拟机(阿里云线上环境)下 think-swoole下到是没有表现出使用超大内存的情况。
  2. 换虚拟机后对比没有发现 swoft 有大内存现象出现。

由此确定下来阿里云线上环境的Linux内核参数可能出现问题。查看内存后发现/proc/memeinfo下 pgpout pgpint 明显比其他虚拟机少10倍的数字,经过查阅发现是由于开启的了透明大页内存的缘故。

问题解决 关闭透明大页。

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

自动关闭

sudo tee /etc/systemd/system/disable-thp.service <<-'EOF'
[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload

sudo systemctl start disable-thp
sudo systemctl enable disable-thp

期望更新 启动框架时提示一个warning,类似于mongodb也会给出一个waning。

image

最后的疑惑 为什么think-swoole 看来是正常的呢,用的同样think-swoole ? 能帮忙想想是哪里没有思考对。

题外话:swoft与tpswoole测试框架性能比较 大概是由于swoft的路由不用每次都扫目录,所以好像cpu只会偶尔爆发。但是 tp 会一直cpu 100%。 image

Jamlee commented 4 years ago

周末了时间空起来啦,补上复现的方式的

正常情况

image

大页没有选择 always,madvise 表示自主选择使用透明大页 image

复现情况

image

echo 'always' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'always' > /sys/kernel/mm/transparent_hugepage/defrag

看到了的500MB,多了10倍内存消耗。

image