下面的dockerd占用了5G的内存+2.6G的swap,管理几个容器需要这么多的资源吗?一定是哪里有bug?
图中的java和mysql也都是不怎么使用的,所以占用很多的swap; 真正用的时候就会很慢。
DevOps
下面的dockerd占用了5G的内存+2.6G的swap,管理几个容器需要这么多的资源吗?一定是哪里有bug?
图中的java和mysql也都是不怎么使用的,所以占用很多的swap; 真正用的时候就会很慢。
1 2 |
# uname -a Linux VM-2-10-12 3.10.0-514.6.1.el7.x86_64 #1 SMP Wed Jan 18 13:06:36 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux |
1 2 |
# docker -v Docker version 1.12.5, build 047e51b/1.12.5 |
centos6.8
启动进程: /sbin/init (因为启动这个可以直接利用 init-scripts 配置自动启动的进程,比如: mysqld等)
docker stop $name
现象: 卡死了,进不去了
/sbin/init进程不退出,由init进程启动的子进程也处于defunct状态; 很可能是上级的某进程存在bug; 逐级上朔,找到shim进程,该进程kill 默认信号是不死的,看来可能有问题,直接kill -9 ; 然后,容器就干净地退出了
缘起:
为什么我执行ceph health时都是HEALTH_OK,但是搭建了Prometheus+grafana: (参考:https://www.2cto.com/net/201801/712794.html ),看到的状态却是HEALTH_WARN,why?
分析:
我们使用的ceph_exporter: github.com/digitalocean/ceph_exporter ; 参考源码发现,这里使用json格式获取的health,而且参考的是overall_status ; 自己在命令行看看:
1 2 |
# ceph health -f json {"checks":{},"status":"HEALTH_OK","overall_status":"HEALTH_WARN"} |
果不其然,overall_status 为 HEALTH_WARN
办法一:
参考status,不参考overall_status;
缺点:
办法二:
查明为什么overall_status 为HEALTH_WARN , 应该确实存在问题
我的ceph版本: ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)
在 luminous 之前,ceph 输出的都是 overall_status , luminous开始,就开始使用status了,但是,为了兼容以前的版本,还是输出了overall_status了,不过,为了让使用者意识到 overall_status 不建议使用了,所以,就强制将 overall_status 设置为了 HEALTH_WARN; 有时候,这个逻辑显得不太友好,于是,从12.2.2 开始添加了一个选项:
1 |
mon_health_preluminous_compat_warning |
可以通过设置该选项,来禁止这个警告。
但是,我使用的是12.2.1 ,咋办? 要么修改exporter,要么干脆升级ceph
比较稳妥的做法是,在一个测试的机器上,启动一个12.2.5版本的ceph-mon,设置:
1 |
mon_health_preluminous_compat_warning=false |
然后,ceph.conf中指定连接该ceph-mon,测试效果如下:
1 2 |
# ceph health -f json {"checks":{},"status":"HEALTH_OK"} |
没有了overall_status; 如此的话,ceph_exporter 就是要overall_status的话,还真就得修改ceph_exporter了, fork 后修改之:
https://github.com/phpor/ceph_exporter
参考:
https://github.com/ceph/ceph/pull/17930
http://lists.ceph.com/pipermail/ceph-users-ceph.com/2017-September/021031.html
排序一般使用sort命令,但是,sort命令是基于行的:
1 |
echo a c b d|sort |
这个是不会输出 : a b c d 的
可以这样:
1 |
echo a c b d | xargs -n 1 |sort |
也或者:
1 |
echo a c b d |while read w; do echo $w done | sort |
总之,把空白换成换行
https://google.github.io/styleguide/shell.xml
建议的bash风格,不可不学
1 2 3 4 5 6 7 8 |
function Usage() { cat <<eof Usage: --help: show this help eof } |
注意,这个脚本里面的cat,这里很容易写作echo的,因为php中就是用的echo; 我们很容易将这种语法视为写复杂字符串的一种方法,而在shell中,这不是一个复杂的字符串,而是把这些内容作为命令的标准输入提供给命令的,而不是命令的参数:
1 2 3 4 5 6 7 8 9 10 |
# strace -e read,write cat <<eof aaa eof read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\34\2\0\0\0\0\0"..., 832) = 832 read(0, "aaa\n", 65536) = 4 write(1, "aaa\n", 4aaa ) = 4 read(0, "", 65536) = 0 +++ exited with 0 +++ |
知道了原理之后,就再也不用担心写错了
上胡不法先王之法,非不贤也,为其不可得而法。先王之法,经乎上世而来者也,人或益之,人或损之,胡可得而法?虽人弗损益,犹若不可得而法。
凡先王之法,有要於时也,时不与法俱至。法虽今而至,犹若不可法。故释先王之成法,而法其所以为法。先王之所以为法者何也?先王之所以为法者人也。而己亦人也,故察己则可以知人,察今则可以知古,古今一也,人与我同耳。有道之士,贵以近知远,以今知古,以益所见,知所不见。故审堂下之阴,而知日月之行、阴阳之变;见瓶水之冰,而知天下之寒、鱼鳖之藏也;尝一脟肉,而知一镬之味、一鼎之调。
列出所有安全组:
1 |
openstack security group list |
列出所有名叫default的安全组的ID:
1 |
openstack security group list -fjson|jq -r '.[]|select(.Name == "default")|.ID' |
列出指定安全组下的所有规则: (–long 显示每条规则的方向,默认不显示方向)
1 |
openstack security group rule list --long bc462cd9-1957-4a33-ac22-d3941e5113b5 |
可以通过–ingress –egress 只显示指定方向上的规则; 通过 –protocol 显示指定协议相关的规则
实际应用:
检查是否所有的“default” 安全组都设置了允许所有tcp、udp都可以主动外出的规则:
1 2 3 4 5 |
openstack security group list -fjson|jq -r '.[]|select(.Name == "default")|.ID'| while read id; do echo $id; openstack security group rule list --long $id -f json |jq -r '.[]|select((.["IP Protocol"] == "tcp" or .["IP Protocol"] == "udp") and .["IP Range"] == "0.0.0.0/0" and .["Direction"] == "egress" and .["Port Range"] == "1:65535" and .["Ethertype"] == "IPv4") |.["IP Protocol"]' echo done |
结果输出:
1 2 3 |
1bfd33d7-6278-4718-9680-fd6f3328561d tcp udp |
如果输出了tcp和udp就意味着是正确的
添加安全组规则:
允许所有tcp主动外出访问:
1 |
openstack security group rule create --protocol tcp --remote-ip 0.0.0.0/0 --dst-port "1:65535" --egress --ethertype IPv4 --description "allow all tcp active request" eb9dd2e8-129d-4135-bee8-f92744f5fbdd |
问题: 如题。
现场情况:
问题原因: