有一台服务器很早前部署了一个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的话,可能出现如下图
排在第一位的: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
进行部署,方便保留当时的部署命令。