驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
nginx的oom和动态修改容器资源限制
/  

nginx的oom和动态修改容器资源限制

开篇

有一台服务器很早前部署了一个nginx,它承担着 websocket的连接,每当有活动的时候,大概到1.8W连接数的时候,客户端的 websocket就会断开。

通常遇到这种情况,都会考虑到句柄数的调整,或者 worker_connections的调整。在当时的情况下,这些数字的大小其实远远大于 1.8w

通过下面的命令,查看nginx的日志

方法1

$ cat /var/log/messages | grep nginx

Dec  4 17:11:07 pressure-201 kernel: Killed process 47054 (nginx) total-vm:138000kB, anon-rss:129828kB, file-rss:1452kB, shmem-rss:0kB
Dec  4 17:11:07 pressure-201 kernel: oom_reaper: reaped process 47054 (nginx), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
Dec  4 17:11:07 pressure-201 kernel: Memory cgroup out of memory: Kill process 47055 (nginx) score 690 or sacrifice child

方法2

$ dmesg |grep -E 'kill|oom|out of memory'+

[253605.878407] oom_reaper: reaped process 53471 (nginx), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
[253605.897714] Memory cgroup out of memory: Kill process 53478 (nginx) score 690 or sacrifice child
[253605.900786] oom_reaper: reaped process 53478 (nginx), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

初上上述类似的情况,那么可以认定是 oom了,通过 fres或者 top可以发现物理内存充足,同时因为是容器化部署的,大概率最内存进行了限制。

$ docker stats
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
82eafc7e02fc   nginx      0.00%     256.1MiB / 300MiB   x.x%    xxMB / xxMB    377kB / 74.8kB   3

发现 nginx的最大内存是有 300m

通过如下指令修改内存到你实际需求。

docker update --memory 1024m --memory-swap -1 nginx
# 或者
docker update --memory 1024m --memory-swap 1024m nginx

通常oom的时候,如果容器策略为不停重启,那么系统负载会比较高,此时top的话,可能出现如下图

image.png

排在第一位的:oom_reaper

结语

docker-update的其他命令如下

~ docker update -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker update [OPTIONS] CONTAINER [CONTAINER...]

Update configuration of one or more containers

Options:
      --blkio-weight uint16        Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --cpu-period int             Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int              Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int          Limit the CPU real-time period in microseconds
      --cpu-rt-runtime int         Limit the CPU real-time runtime in microseconds
  -c, --cpu-shares int             CPU shares (relative weight)
      --cpus decimal               Number of CPUs
      --cpuset-cpus string         CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string         MEMs in which to allow execution (0-3, 0,1)
      --kernel-memory bytes        Kernel memory limit
  -m, --memory bytes               Memory limit
      --memory-reservation bytes   Memory soft limit
      --memory-swap bytes          Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --pids-limit int             Tune container pids limit (set -1 for unlimited)
      --restart string             Restart policy to apply when a container exits

可以看出内存和cpu都可以动态修改。

容器化部署的时候,如果项目小推荐 rancher1.x,大项目还是要上 k8s。如果rancher都不想用,那么只要要通过 docker-compose进行部署,方便保留当时的部署命令。

骐骥一跃,不能十步。驽马十驾,功在不舍。