K3s Too Many Files
๐ K3s์์ โToo many open filesโ ์ค๋ฅ ํด๊ฒฐ๊ธฐ
๐ฆ inotify & ulimit ์ค์ ํ๋์ผ๋ก ์ํฌํ๋ก์ฐ ์ ์ํํ๊ธฐ
์ต๊ทผ k3s ํด๋ฌ์คํฐ์์ Argo Workflows๋ฅผ ๋๋ฆฌ๋ ์ค, ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค:
Failed to allocate directory watch: Too many open files
ํน์ ์ด๋ฐ ๋ก๊ทธ ๋ณด์
จ๋ค๋ฉด, ์ ๋ ๊ฐ์ ์ํฉ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ด ์ค๋ฅ๋ ๋์ฒด๋ก ํ์ผ ๋์คํฌ๋ฆฝํฐ ์๊ฐ ๋ถ์กฑํ๊ฑฐ๋, ํ์ผ ๊ฐ์(inotify) ์ ํ์ ๊ฑธ๋ ธ์ ๋ ๋ฐ์ํฉ๋๋ค.
๐ ์ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๊น?
๋ฆฌ๋
์ค ์์คํ
์๋ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋์์ ์ด๊ฑฐ๋ ๊ฐ์ํ ์ ์๋ ํ๋๊ฐ ์กด์ฌํฉ๋๋ค.
ํนํ Python์์ uvicorn --reload๋ watchfiles ๊ฐ์ ๊ฑธ ์ฐ๊ณ ์๋ค๋ฉด, ๋๋ ํฐ๋ฆฌ๋ง๋ค ๊ฐ์ ์ธ์คํด์ค๊ฐ ๋ถ๊ธฐ ๋๋ฌธ์ ์์ฒ ๊ฐ์ ๊ฐ์ ์์ฒญ์ด ํ๊บผ๋ฒ์ ๋ฐ์ํฉ๋๋ค.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ Step-by-Step
1๏ธโฃ inotify ์ปค๋ ํ๋ผ๋ฏธํฐ ์ํฅ
๋จผ์ ์ปค๋์ด ๊ฐ์ํ ์ ์๋ ํ์ผ ๊ฐ์์ ์ธ์คํด์ค ์๋ฅผ ๋๋ ค์ผ ํด์.
sudo nano /etc/sysctl.d/k3s-inotify.conf
์๋ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ์ต๋๋ค:
fs.inotify.max_user_instances=512
fs.inotify.max_user_watches=524288
fs.inotify.max_queued_events=32768
์ค์ ์ ์ ์ฉํฉ๋๋ค:
sudo sysctl --system
๐ ์ฐธ๊ณ ๋ก ๊ธฐ๋ณธ๊ฐ์ max_user_instances=128, max_user_watches=8192 ์ ๋๋ก ๋งค์ฐ ๋ฎ์์. ์ ์์น๋ ๋๋ํ๊ฒ ์ก์ ๊ฐ์
๋๋ค.
2๏ธโฃ root ์ฌ์ฉ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ ์ ํ(ulimit) ์ํฅ
๋ค์์ผ๋ก root ์ฌ์ฉ์๊ฐ ์ด ์ ์๋ ํ์ผ ๊ฐ์๋ ๋๋ ค์ผ ํด์.
sudo nano /etc/security/limits.d/99-root-nofile.conf
๋ค์ ๋ด์ฉ์ ์ถ๊ฐํฉ๋๋ค:
root soft nofile 65536
root hard nofile 65536
์ด ์ค์ ์ root๋ก ์คํ๋๋ ํ๋ก์ธ์ค์๋ง ์ ์ฉ๋ผ์.
k3s๋ root๊ฐ ๋์ฐ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ ์ฉํ๋ ๊ฒ ํต์ฌ์ด์์!
3๏ธโฃ k3s systemd ์๋น์ค์ open file ์ ํ ์ถ๊ฐ
์ด์ systemd์๊ฒ๋ โ์ฐ๋ฆฌ ๋ง์ด ์ด ์ ์์ด์โ๋ผ๊ณ ์๋ ค์ค์ผ ํด์.
sudo mkdir -p /etc/systemd/system/k3s.service.d
sudo nano /etc/systemd/system/k3s.service.d/override.conf
๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค:
[Service]
LimitNOFILE=65536
๋ฐ์์ ์ํด systemd๋ฅผ ์๋ก ๊ณ ์ณ์ค์:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart k3s
4๏ธโฃ containerd๋ ํ์ผ ์ ์ ํ ํ๊ธฐ
k3s๋ ๋ด๋ถ์ ์ผ๋ก containerd๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์, ์ปจํ
์ด๋ ๋ด๋ถ์์๋ ํ์ผ์ ๋ง์ด ์ด ์ ์๊ฒ ํด์ค์ผ ํฉ๋๋ค.
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo nano /etc/containerd/config.toml
๋ค์ ๋ด์ฉ์ ์ฐพ๊ฑฐ๋ ์๋ก ์ถ๊ฐํด ์ฃผ์ธ์:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
runc_default_ulimit = ["nofile=65536:65536"]
๊ทธ ๋ค์:
sudo systemctl restart containerd
sudo systemctl restart k3s
5๏ธโฃ ํ์ธํด๋ณด๊ธฐ
์ปจํ ์ด๋ ์์์ ์ง์ง ์ ์ ์ฉ๋๋์ง ํ์ธํด๋ณผ๊น์?
kubectl exec -it <pod-name> -- sh -c 'ulimit -n'
๐ ์ถ๋ ฅ์ด 65536 ์ด์์ด๋ฉด ์ฑ๊ณต์
๋๋ค!
๐งน ๋ณด๋์ค: reload ๋ชจ๋ ์ ๊ฑฐ
๋ง์ฝ uvicorn --reload ๊ฐ์ ๊ฑธ ์ฐ๊ณ ์๋ค๋ฉด, ์ด๊ฑธ ๊ผญ ์ ๊ฑฐํด ์ฃผ์ธ์.
๊ฐ๋ฐ ๋ชจ๋์์๋ ์ ์ฉํ์ง๋ง, ํ๋ก๋์
ํ๊ฒฝ์์๋ ๋ถํ์ํ๊ฒ inotify ๋ฆฌ์์ค๋ฅผ ์ฐ๊ฒ ๋ฉ๋๋ค.
# ์๋ชป๋ ์ โ
uvicorn app.main:app --reload
# ์ฌ๋ฐ๋ฅธ ์ โ
uvicorn app.main:app --host 0.0.0.0 --port 8000
โ ๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ
| ํญ๋ชฉ | ์ค์ ๊ฐ |
|---|---|
fs.inotify.max_user_instances |
512 ์ด์ |
ulimit -n |
65536 ์ด์ |
LimitNOFILE (systemd) |
65536 |
runc_default_ulimit (containerd) |
["nofile=65536:65536"] |
์ด๋ ๊ฒ ์ค์ ํ๊ณ ๋๋, ๋ ์ด์ "Too many open files" ์ค๋ฅ๋ฅผ ๋ชป ๋ด์ ๋๋ฌด ํ๋ณตํฉ๋๋ค ๐
๊ฐ์ ๋ฌธ์ ๊ฒช์ผ์
จ๋ค๋ฉด ๊ผญ ๋ฐ๋ผ ํด๋ณด์ธ์!
ํ์ํ์๋ฉด ์ด ์ค์ ์ ์๋ํํ๋ ์คํฌ๋ฆฝํธ ๋ฒ์ ๋ ๋ฐ๋ก ๋ง๋ค์ด ๋๋ฆด ์ ์์ด์.
ํน์ ์ด ๋ด์ฉ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ถ๋ถ ์์ผ์ ๊ฐ์?