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配置。