这是 supervisor 的配置:
[program:watchdog]
command=python3.9 /app/watchdog/wd.py
directory=/app/watchdog/
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/watchdog.log
loglevel=info
startsecs = 20
程序的代码涉及比较复杂的业务逻辑暂时没办法发出来。
有什么办法排查吗?
1
eason1874 2022-11-21 12:25:00 +08:00
盲猜 DNS 缓存问题,bash 环境有缓存,而 aiohttp 没有缓存
|
2
pcbl 2022-11-21 12:28:15 +08:00 via Android 2
类似的毛病我遇到过自己排查分析了好几天才搞定
楼主试着把 supervisor 中文件打开数限制调大应该可以解决。 |
3
edis0n0 OP @eason1874 #1 bash 还能缓存 python 脚本解析的域名吗?是在 bash 中手动用 python3.9 命令运行同一个脚本,一点问题都没有,supervisor 运行的 python3.9 5 分钟就几十万条报错
|
4
guanzhangzhang 2022-11-21 12:31:36 +08:00 1
systemd 的 limit file 和 supervisor 你的 program 的 file open 啥的都加大一些试试
|
6
edis0n0 OP 就加了一行 minfds = 655350 然后重启 supervisor 服务
|
7
edis0n0 OP 昨天排查了一整天都没解决
|
8
liuzhedash 2022-11-21 12:37:20 +08:00
|
9
guanzhangzhang 2022-11-21 12:40:09 +08:00
@liuzhedash supervisor 这种肯定不会缓存的,因为 dns 缓存都是 glibc 或者 java 的 runtime 有参数决定的,手动 run 没问题,放 supervisor 纳管就有问题明显就是 fd 相关的。例如很多小白 mysql 用 systemd 纳管,写了个很简单的 systemd.service 文件,systemd 的默认 fd 是 4096 ,会导致 mysql 效率不行
|
10
edis0n0 OP @guanzhangzhang #9 手动 run 的话有缓存吗?直接改 fd 让程序跑起来会不会影响性能?
|
11
edis0n0 OP 我们没有专业运维搞不定,数据库用的都是各大云厂商的云数据库服务
|
12
guanzhangzhang 2022-11-21 12:44:18 +08:00
@edis0n0 你可以搜下 关于 limits 生效的四个案例 ,用户和纳管的进程是不一样的
|
13
lucays 2022-11-21 13:22:58 +08:00
|
14
ClericPy 2022-11-21 20:27:53 +08:00
ulimit -n 开到百万, 然后 aiohttp 里 HTTP 适配器那俩 limit 也改大点
|
15
julyclyde 2022-11-22 09:00:55 +08:00 1
|
16
wliansheng 2022-11-22 11:49:11 +08:00
@julyclyde 使用 supervisord ,我也遇到这个问题,不用这个那么用什么啊?
|
17
julyclyde 2022-11-22 11:52:11 +08:00
@wliansheng 建议托管给 systemd ,并在单一的位置(即 systemd service unit file )集中声明程序运行所需的环境
|