技术解析

问下脚本在容器里占用资源比在实机上直接运行高得多可能会是由什么引起的
0
2021-06-29 11:03:57
idczone

我写了一个 docker,把 oblique/create_ap 这个脚本修改了一下和 ss-redir 放到里面,搭建了一个可以创建自带全局代理的热点的镜像,但是现在遇到了问题,在宿主机上直接运行这两个服务占用资源不算多,但放进容器之后这个建立热点的脚本差不多能占满一个核,而且用 docker exec 看了下容器这个脚本里开了 3 个进程,一开始记得只有一个,不知道这种情况可能是由什么引起的

docker exec 0ee6068bdeaf ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0    200     4 ?        Ss   17:28   0:00 /usr/bin/dumb-init -- /my_init
root         7  0.0  0.5   6368  5192 ?        Ss   17:28   0:00 /usr/bin/python -u /my_init
root         9  0.5  1.3  14492 12336 ?        S    17:28   0:01 /usr/bin/python2 /usr/bin/supervisord -c /etc/supervisord.conf
root        12  0.0  0.1   2412  1776 ?        S    17:28   0:00 /bin/bash /usr/local/bin/create_ap wlan0 eth0 MyAccessPoint MyPassPhrase
root        13  0.0  0.0   1636     4 ?        S    17:28   0:00 /usr/sbin/crond -f
root        14  0.0  0.0   2896   796 ?        S    17:28   0:00 ss-redir -u -s $SS_SERVER_IP -p $SS_SERVER_PORT -l $SS_LOCAL_PORT -k $SS_PASSWD -m $SS_METHOD -b 0.0.0.0
root        15  0.0  0.1  14956  1340 ?        Sl   17:28   0:00 /usr/sbin/rsyslogd -n
nobody     139  0.0  0.0    976    60 ?        S    17:29   0:00 dnsmasq -C /tmp/create_ap.wlan0.conf.00dNEmn1/dnsmasq.conf -x /tmp/create_ap.wlan0.conf.00dNEmn1/dnsmasq.pid -l /tmp/create_ap.wlan0.conf.00dNEmn1/dnsmasq.leases -p 5353
root       140  0.0  0.1   2412  1504 ?        S    17:29   0:00 /bin/bash /usr/local/bin/create_ap wlan0 eth0 MyAccessPoint MyPassPhrase
root       141  0.0  0.0   3448   704 ?        S    17:29   0:00 /usr/sbin/hostapd /tmp/create_ap.wlan0.conf.00dNEmn1/hostapd.conf
root       543 92.7  5.3  51732 50824 ?        R    17:34   0:03 /bin/bash /usr/local/bin/create_ap wlan0 eth0 MyAccessPoint MyPassPhrase
root       547  0.0  0.0   1620   640 ?        Rs   17:34   0:00 ps -aux

修改后的脚本: https://github.com/yangxuan8282/create_ap/blob/master/create_ap
主要是用 iptables 把流量都转发到 1080 端口,也就是 ss-redir 的端口

没有去看你的脚本。假设你的脚本在两处跑的东西都一样。
你在容器外 ps aux 看到那几个容器里的进程资源使用是什么?你有没有查 cpuacct.usage?

用这个看
docker stats `docker ps --format='{{.Names}}'`


这个命令好像以前没用过
```
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ssap_ss_ap_1 99.98% 80.06MiB / 923.4MiB 8.67% 0B / 0B 16.3MB / 90.1kB 0
```
能看到 cpu 占用是挺高的,不过还是不清楚是由什么导致的

正常做法:容器内部运行 top 或者 htop 查看 cpu 占用最高的进程,排查原因。

快速做法:不管什么原因,直接添加--cpus=".05"参数限制使用 CPU。( 5%的意思)


cpus 的选项我试了一下报错说:
```
NanoCPUs can not be set, as your kernel does not support CPU cfs period/quota or the cgroup is not mounted
```
看 github issues 大概是因为内核没打开相关的选项
资源占用高确实是由建立热点的脚本引起的,而且后来试了一下修改前的脚本也是占用资源高
去原脚本的 github 上开了个 issues,不知道作者会不会回复

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服