8月 052017
 

缘起:

dubbo-monitor容器swap使用率超过 20% ,而且在不断上升,为什么呢?

 

下面是容器dubbo-monitor在drop-caches前后的对比:

 

drop-cache后,容器的swap使用率没有变化

 

结论:

  1. docker stats 显示的内存使用是包含cache的
  2. 该容器的部分cache信息会被swap出内存
    1. cache和swap之间存在一些不默契;cache认为内存够多,还可以cache更多信息;swap机制为,经内存充裕,只要是不常被访问的内存数据,尽量swap出来; 于是乎,就形成了一个恶性循环,导致swap占用越来越大
    2. 解决办法: 定期drop一下cache
  3. 系统不会傻到把cache内容换出到swap中的,swap确实为进程使用的(虚拟)内存的一部分
  4. 一个允许最大使用2g内存的java进程,swap出来500m或1g不足为奇,如果给他的swap大小为2g的话,占用50%的swap都有可能
 Posted by at 下午 2:47

docker swarm 模式下证书过期后daemon无法启动

 docker  docker swarm 模式下证书过期后daemon无法启动已关闭评论
7月 212017
 

报错信息:

相关文章: https://github.com/moby/moby/issues/24132

解决办法:  把 Docker Root Dir (通过docker info查看)下的swarm目录删掉就好了

 

 Posted by at 下午 4:44

关于nsenter

 docker  关于nsenter已关闭评论
5月 292017
 

从 help 来看,只要使用了 -p 选项,就可以进入目标进程的pid名字空间,换言之,就可以只看到目标进程所在的名字空间的进程,用法如下:

事实上,

看到的却是nsenter当前所在名字空间(严格来讲,这样描述也不太准确)的所有进程,为什么呢?

因为top参考的是 /proc 文件系统,所以,进入相应的mount空间也很重要,所以,正确的写法为:

 Posted by at 上午 3:25

docker info 之cgroupdriver和runc

 docker, 默认分类  docker info 之cgroupdriver和runc已关闭评论
5月 112017
 

关于cgroupdriver:

docker 默认的cgroupdriver为cgroupfs,也可以手动指定(通过环境变量、命令行参数、daemon.json)systemd,有些docker的rpm包会在 /usr/lib/systemd/system/docker.service 中通过命令行的方式指定cgroupdriver为systemd, 当前支持的cgroupdriver有: cgroupfs、systemd; 命令行设置方式:

虽然创建容器时没有指定cgroupdriver的选项,但是通过修改cgroupdriver重启daemon,可以使得同一个daemon下的容器使用不同的cgroupdriver的(仅仅是出于理解技术实现的思考,实践中似乎没有任何必要)

曾经有文章中疑惑,有的docker容器的cgroup都是在相同的docker目录下的,有的却是docker-xxxx.scope; 原因就在于前者是通过cgroupfs来实现的,后者是通过systemd来实现的; 另外 docker daemon也可以通过选项–cgroup-parent 来指定一个父cgroup(cgroup是有层级结构的),默认为docker,根据cgroupdriver的不同,该cgroup-parent的表现形式也不同,cgroupfs中表现为父目录,systemd中表现为前缀(参考: https://docs.docker.com/engine/reference/commandline/dockerd/#default-cgroup-parent );每个容器都可以有自己的–cgroup-parent,这个对于不同容器进行分组时似乎是不错的。

 

关于runc:

默认runc为 docker-runc,其实runc表现为一个可执行的二进制文件,docker info中显示的只是一个配置时指定的名字,至于该名字对应哪个二进制文件,是在配置的时候指定的,也就是说,你可以在不修改配置的情况下,直接修改对应的二进制文件来修改runc,重启容器就会生效; 另外,创建容器的时候,可以指定runc,指定的是配置daemon时使用的名字,每个容器可以有不同的runc

 

 

 Posted by at 下午 3:40

磁盘调度算法

 docker, Linux & Unix, storage  磁盘调度算法已关闭评论
5月 112017
 

参考: http://blog.csdn.net/theorytree/article/details/6259104

说明: 显示所有支持的调度策略, 方框内的是当前启用的调度策略

查看当前系统支持的调度算法:

难道调度算法和设备本身也有关系?从下面来看,阿里云的云盘不支持任何调度策略:

但是:

值得一提的是,Anticipatory算法从Linux 2.6.33版本后,就被移除了,因为CFQ通过配置也能达到Anticipatory算法的效果。

 

查资料发现, 调度策略为 ‘none’ 的现象和阿里云虚拟机没关系,和阿里云云盘没关系,和操作系统版本也没有(直接)关系,仅仅和内核版本有关系, linux内核从3.13开始引入 blk-mq 队列机制,并在3.16得以全部实现,上面看到的非‘none’的情况,内核版本都在3.10之前,为‘none’的情况是被我手动升级内核到4.4.61 的

如何验证是否启用了blk-mq机制?可以通过查看是否存在mq目录,如下:

目录不存在,说明没有启用该机制

存在mq目录,说明使用的是blk-mq机制

参考: https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq)

参考: http://www.cnblogs.com/cobbliu/p/5389556.html

 Posted by at 上午 10:29

docker 版本号定义

 docker  docker 版本号定义已关闭评论
4月 202017
 

参考: https://github.com/moby/moby/blob/master/CHANGELOG.md

2017年2月8号发布了docker-1.13.1, 下一个版本便是2017年3月1号发布的17.03.0-ce,其中: ce代表社区版,17.03 代表2017年3月,以后docker的版本就按照YY.MM来命名了:

17.03.0-ce (2017-03-01)

IMPORTANT: Starting with this release, Docker is on a monthly release cycle and uses a new YY.MM versioning scheme to reflect this. Two channels are available: monthly and quarterly. Any given monthly release will only receive security and bugfixes until the next monthly release is available. Quarterly releases receive security and bugfixes for 4 months after initial release. This release includes bugfixes for 1.13.1 but there are no major feature additions and the API version stays the same. Upgrading from Docker 1.13.1 to 17.03.0 is expected to be simple and low-risk.

虽然此次命名方式发生了变化,和上个版本相比,变更的内容并不多,都是小修小改

 Posted by at 下午 12:31

docker swarm 学习

 docker  docker swarm 学习已关闭评论
4月 122017
 

docker swarm 居然和–live-restore 不兼容,真恶心

 

 

参考:

http://www.jianshu.com/p/9eb9995884a5

 Posted by at 下午 6:12