Hello!
当你有较多的 Lua 代码要载和 JIT 编译时,这是期望的。解决的办法有下面几种,建议同时使用:
1. 避免频繁地 reload nginx 进程,在某些局部 Lua 代码有更新时,使用 Lua 代码按需热加载的办法。
2. 上线前把所有 .lua 文件用同一个 OpenResty 自带的 luajit 命令行工具预编译为 LuaJIT
字节码文件,见这里:https://github.com/openresty/lua-nginx-module#lualuajit-bytecode-support
这可以节约 reload 或 binary upgrade 期间从 Lua 源码到 LuaJIT 字节码的编译开销。
3. 改用 binary upgrade 来重启服务,而不是 HUP reload。binary upgrade 时,在向老的 nginx
master 进程先后发送 USR2 和 QUIT 信号的中间时间间隔可以适当调大(几秒,几十秒,根据实际需要),这样可以给新启动的
worker 足够长的时间预热,而老 worker 在此过渡时间窗口内又可以继续高效地服务请求。而使用 HUP reload
则没法做到这一点了。
当然,实际确认你 reload 时的开销分布,需要上火焰图之类的工具进行分析了。一般情况就是我上面说的,但也不排除你们在 init 或
init_worker 阶段跑了自己的很重的逻辑。都有可能了。
Best,
Yichun
On Sun, Apr 28, 2019 at 11:39 PM GuGu <bian...@gmail.com> wrote:
>
> 当前使用openresty/1.13.6.2版本,单机QPS 8K。在进行reload时服务器cpu使用率将近100%同时499请求增加(客户端超时500ms),猜测是因为nginx reload后cpu使用率增加导致请求处理时间增长,但是为什么会reload时cpu会彪高的原因未定位到,也没有较好的排查思路,请各位大神赐教。
> 499数量监控:
> CPU使用率:
>
> Reload时间点:
>
> nginx.conf配置文件(已删除与业务相关的配置):
> worker_rlimit_nofile 40960;
> worker_processes auto;
> worker_rlimit_core 1g;
> worker_cpu_affinity auto;;
> pid /var/run/nginx.pid;
>
> events {
> worker_connections 40960;
> accept_mutex on;
> accept_mutex_delay 100ms;
> }
>
> http {
> server_tokens off;
> resolver local=on;
> include /etc/nginx/mime.types;
> default_type application/octet-stream;
> server_names_hash_bucket_size 256;
> check_shm_size 8m;
>
>
> sendfile on;
> keepalive_timeout 90;
> gzip on;
> gzip_proxied any;
> gzip_comp_level 4;
> gzip_min_length 1000;
> gzip_types text/css application/javascript application/x-javascript application/json;
>
> ssl_session_cache shared:SSL:50m;
> ssl_session_timeout 5m;
> ssl_prefer_server_ciphers on;
>
>
>
> client_body_buffer_size 256k;
>
>
> include /etc/nginx/conf.d/[0-9]*.conf;
> include /etc/nginx/conf.d/[a-z]*.conf;
> }
>
>
> --
>