如何在Docker內部使用ulimit——如何在docker內部生成core
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配置。