如何在Docker内部使用ulimit——如何在docker内部生成core
Ulimit在linux里ulimit命令可以对shell生成的进程的资源进行限制。常用的ulimit限制打开文件句柄数core文件大小设置进程能够消耗的虚拟内存设置用户能够打开的进程数目不太常用的ulimit限制设置数据段的最大值.单位:kbytes设置创建文件的最大值.单位:bloc...
Ulimit
在linux里ulimit命令可以对shell生成的进程的资源进行限制。
常用的ulimit限制
- 打开文件句柄数
- core文件大小
- 设置进程能够消耗的虚拟内存
- 设置用户能够打开的进程数目
不太常用的ulimit限制
设置数据段的最大值.单位:kbytes
设置创建文件的最大值.单位:blocks
设置在内存中锁定进程的最大值.单位:kbytes
设置可以使用的常驻内存的最大值.单位:kbytes
设置内核可以同时打开的文件描述符的最大值.单位:n
设置管道缓冲区的最大值.单位:kbytes
设置堆栈的最大值.单位:kbytes
设置CPU使用时间的最大上限.单位:seconds
ulimit设置限制的两条水线
ulimit设置限制的时候会设置两条线soft和hard线,当资源到达了soft线那么只是告警,如果达到了hard线那么内核就强制限制了。
在docker里使用ulimit限制
从上面小节中可以看到linux系统可以通过配置ulimit对很多资源进行限制。在docker内部如何使用ulimt这个工具便利性呢。
在dockerd中为所有容器配置默认的ulimit
- 在/etc/docker/daemon.json里通过
“ulimit”:ulimit-resource=M:N 对所有容器默认某个资源进行限制。
表2-1
上表中M为soft水线,N为hard水线。如果“=”右边只有一个那么同时设置soft水线=hard水线
- 在dockerd启动参数中设置
这种方式是指通过修改docker.service文件或者直接命令行启动dockerd的方式
--default-ulimit unlimit-resources=M:N
表2-2
表2-2中的M和N和表2-1中的同义
在docker run时为某个容器设置ulimit
除了在dockerd里设置容器的默认ulimit值,还可以为某个容器指定一个的ulimit值。这借助在docker run时带参数
--ulimit ulimit-resources=M:N
表2-3
表2-3中的M和N和表2-1中同意义
docker中能够设置的ulimit参数
常用的docker ulimit设置项
参数 | 意义 | 例子 |
---|---|---|
nofile | shell进程打开文件数目 | docker run --ulimit nofile=20 |
core | 进程生成core文件的尺寸 | docker run --ulimit core =-1 //开启进程core |
nproc | shell能打开的进程多少 | Na |
fsize | 进程写文件的最大尺寸 | na |
其他docker ulimit设置项
参数 | 意义 | 例子 |
---|---|---|
cpu | ulimit cpu 限制进程能够使用的cpu资源,单位为s。当达到soft线后触发SIGXCPU,默认为杀死进程(可以忽略此信号)。达到hard线后,发送SIGKILL | na |
data | ulimit data | na |
locks | ulimit locks | na |
memlock | ulimit memlock | na |
msgqueue | ulimit msgqueue | na |
Nice | ulimit nice | na |
rss | ulimit rss | na |
rtprio | ulimit rtprio | na |
rttime | Ulimit rttime | na |
Sigpending | ulimit sigpending | na |
stack | ulimit stack | na |
Docker里如何实现ulimit的传递
ulimit参数定义和解析
docker里对ulimit参数的定义在go-unit/ulimit.go里,这里定义了docker可以传递的ulimit参数。
- 参数解析是通过
opts/ulimit.Set()设置内部结构
opts/ulimit.GetList()取用 - 参数解析过程
NewRunCommand()/NewCreateCommand() --->opts.AddFlags()—->pflag.FlagSet.Var()解析命令行传递过来的ulimit参数,FlagSet最终调用opts/ulimit.Set()将命令行传递的参数转换为内部格式。
Container.runCreate()—>runconfigopts.Parse==opts.Parse()将内部格式转换为container.HostConfig格式。而这个HostConfig格式最终变成一个runc的spec(config.json)里的hostconfig字段rlimit。
而runc解析configxx.json,完成ulimit配置。
更多推荐
所有评论(0)