{"id":618,"date":"2026-10-04T12:00:00","date_gmt":"2026-10-04T12:00:00","guid":{"rendered":"https:\/\/konteynerium.com\/index.php\/2026\/10\/04\/container-kaynak-limitleri-memory-cpu-pids-oom\/"},"modified":"2026-10-04T12:00:00","modified_gmt":"2026-10-04T12:00:00","slug":"container-kaynak-limitleri-memory-cpu-pids-oom","status":"publish","type":"post","link":"https:\/\/konteynerium.com\/index.php\/2026\/10\/04\/container-kaynak-limitleri-memory-cpu-pids-oom\/","title":{"rendered":"Container Kaynak Limitleri: Bellek, CPU, PID ve OOM Davran\u0131\u015f\u0131"},"content":{"rendered":"<p>Varsay\u0131lan olarak bir container, host&#8217;un bellek ve CPU&#8217;sunun tamam\u0131n\u0131 kullanabilir. Bu, tek bir kontrolden \u00e7\u0131km\u0131\u015f container&#8217;\u0131n (bellek s\u0131z\u0131nt\u0131s\u0131, sonsuz d\u00f6ng\u00fc, fork bombas\u0131) ayn\u0131 makinedeki <em>t\u00fcm di\u011fer<\/em> servisleri \u00e7\u00f6kertebilece\u011fi anlam\u0131na gelir. Kaynak limitleri, bir container&#8217;\u0131n ne kadar kullanabilece\u011fini s\u0131n\u0131rlayarak hasar\u0131 kendi i\u00e7inde tutar. Bu yaz\u0131da bellek, CPU ve s\u00fcre\u00e7 say\u0131s\u0131 limitlerini, a\u015f\u0131ld\u0131klar\u0131nda ne oldu\u011funu ger\u00e7ek \u00e7\u0131kt\u0131larla g\u00f6steriyoruz.<\/p>\n<h2>Temel bayraklar<\/h2>\n<table>\n<thead>\n<tr>\n<th>Bayrak<\/th>\n<th>Ne yapar?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>--memory<\/code> \/ <code>-m<\/code><\/td>\n<td>Sert bellek s\u0131n\u0131r\u0131 (en az 6 MB). A\u015f\u0131l\u0131rsa s\u00fcre\u00e7 \u00f6ld\u00fcr\u00fcl\u00fcr<\/td>\n<\/tr>\n<tr>\n<td><code>--memory-swap<\/code><\/td>\n<td>Bellek + swap toplam\u0131. <code>--memory<\/code> ile ayn\u0131 de\u011fer = swap kullan\u0131m\u0131 yok<\/td>\n<\/tr>\n<tr>\n<td><code>--memory-reservation<\/code><\/td>\n<td>Yumu\u015fak s\u0131n\u0131r; yaln\u0131zca host&#8217;ta bellek s\u0131k\u0131\u015f\u0131kl\u0131\u011f\u0131 oldu\u011funda devreye girer, garanti vermez<\/td>\n<\/tr>\n<tr>\n<td><code>--cpus<\/code><\/td>\n<td>Kullan\u0131labilecek CPU miktar\u0131 (\u00f6rn. <code>0.5<\/code> = yar\u0131m \u00e7ekirdek)<\/td>\n<\/tr>\n<tr>\n<td><code>--cpu-shares<\/code><\/td>\n<td>CPU s\u0131k\u0131\u015f\u0131kl\u0131\u011f\u0131nda g\u00f6reli a\u011f\u0131rl\u0131k (sert s\u0131n\u0131r de\u011fil)<\/td>\n<\/tr>\n<tr>\n<td><code>--cpuset-cpus<\/code><\/td>\n<td>Container&#8217;\u0131 belirli \u00e7ekirdeklere sabitler<\/td>\n<\/tr>\n<tr>\n<td><code>--pids-limit<\/code><\/td>\n<td>Container i\u00e7inde en fazla ka\u00e7 s\u00fcre\u00e7 olabilece\u011fi<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Limit koyup do\u011frulamak<\/h2>\n<pre><code>docker run -d --name lim \\\n  --memory=64m --memory-swap=64m --memory-reservation=32m \\\n  --cpus=0.5 --pids-limit=20 \\\n  imaj sleep 120\n\n$ docker inspect lim --format 'Memory={{.HostConfig.Memory}} Swap={{.HostConfig.MemorySwap}} NanoCpus={{.HostConfig.NanoCpus}} Pids={{.HostConfig.PidsLimit}}'\nMemory=67108864 Swap=67108864 NanoCpus=500000000 Pids=20\n\n$ docker stats --no-stream lim\nlim  mem=656KiB \/ 64MiB  cpu=0.00%  pids=1<\/code><\/pre>\n<p><code>docker stats<\/code> \u00e7\u0131kt\u0131s\u0131ndaki <code>\/ 64MiB<\/code>, limitin ger\u00e7ekten uyguland\u0131\u011f\u0131n\u0131 g\u00f6sterir. Limitlerin \u00e7ekirdekte nas\u0131l g\u00f6r\u00fcnd\u00fc\u011f\u00fcne bakmak isterseniz, container i\u00e7indeki cgroup dosyalar\u0131 de\u011ferleri do\u011frular. Denedi\u011fimiz ortamda (cgroup v1) <code>memory.limit_in_bytes<\/code> <code>67108864<\/code> ve <code>pids.max<\/code> <code>20<\/code> okundu. Modern Linux da\u011f\u0131t\u0131mlar\u0131n\u0131n \u00e7o\u011funda kullan\u0131lan cgroup v2&#8217;de ayn\u0131 bilgi <code>\/sys\/fs\/cgroup\/memory.max<\/code> ve <code>pids.max<\/code> dosyalar\u0131ndad\u0131r.<\/p>\n<div class=\"callout\">\n  <span class=\"glyph\">i<\/span><\/p>\n<p>Bu denemeyi yapt\u0131\u011f\u0131m\u0131z Docker 29.4 ortam\u0131 cgroup v1 \u00fczerindeydi ve Docker &#8220;cgroup v1 deste\u011fi kullan\u0131mdan kald\u0131r\u0131lm\u0131\u015ft\u0131r, en ge\u00e7 May\u0131s 2029&#8217;a kadar kald\u0131r\u0131lacakt\u0131r&#8221; uyar\u0131s\u0131 verdi. Yeni kurulumlarda cgroup v2 beklemelisiniz.<\/p>\n<\/div>\n<h2>Bellek limiti a\u015f\u0131l\u0131nca: OOM<\/h2>\n<p>Container belle\u011fi sert s\u0131n\u0131r\u0131n\u0131 a\u015farsa \u00e7ekirde\u011fin OOM (out-of-memory) mekanizmas\u0131 s\u00fcreci \u00f6ld\u00fcr\u00fcr. Bunu 16 MB s\u0131n\u0131r\u0131 olan bir container&#8217;da ~40 MB&#8217;l\u0131k bir de\u011fi\u015fken olu\u015fturarak tetikledik:<\/p>\n<pre><code>$ docker run --name oom --memory=16m --memory-swap=16m imaj sh -c 'x=$(head -c 40000000 \/dev\/zero | tr \"\\0\" \"a\"); echo ${#x}'\n$ echo $?\n137\n\n$ docker inspect oom --format 'OOMKilled={{.State.OOMKilled}} ExitCode={{.State.ExitCode}}'\nOOMKilled=true ExitCode=137<\/code><\/pre>\n<p>\u00c7\u0131k\u0131\u015f kodu <strong>137<\/strong> (128 + SIGKILL 9) ve <code>OOMKilled=true<\/code> \u2014 bir container&#8217;\u0131n &#8220;sebepsiz&#8221; s\u00fcrekli yeniden ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcrseniz ilk bakaca\u011f\u0131n\u0131z yer budur. Uygulaman\u0131n ger\u00e7ek bellek ihtiyac\u0131n\u0131 \u00f6l\u00e7\u00fcn (<code>docker stats<\/code>) ve limiti buna g\u00f6re, biraz pay b\u0131rakarak ayarlay\u0131n; \u00e7ok d\u00fc\u015f\u00fck limit servis kesintisi, \u00e7ok y\u00fcksek limit koruma kayb\u0131 demektir.<\/p>\n<h2>S\u00fcre\u00e7 limiti: fork bombas\u0131na kar\u015f\u0131<\/h2>\n<p><code>--pids-limit<\/code>, bir container&#8217;\u0131n s\u0131n\u0131rs\u0131z s\u00fcre\u00e7 \u00fcretmesini engeller. Limit 5 iken sekiz arka plan s\u00fcreci ba\u015flatmay\u0131 denedi\u011fimizde kabuk \u015funu s\u00f6yledi:<\/p>\n<pre><code>$ docker run --rm --pids-limit=5 imaj sh -c 'for i in 1 2 3 4 5 6 7 8; do sleep 5 &amp; done'\n\/bin\/sh: 0: Cannot fork<\/code><\/pre>\n<p>Limit a\u015f\u0131l\u0131nca yeni s\u00fcre\u00e7 olu\u015fturulam\u0131yor; b\u00f6ylece bir fork bombas\u0131 host&#8217;u de\u011fil yaln\u0131zca kendi container&#8217;\u0131n\u0131 t\u0131kar.<\/p>\n<h2>Compose&#8217;ta limitler<\/h2>\n<pre><code>services:\n  api:\n    image: uygulama:1\n    deploy:\n      resources:\n        limits:\n          cpus: \"0.5\"\n          memory: 256M\n        reservations:\n          memory: 128M\n    pids_limit: 200<\/code><\/pre>\n<p>Bu tan\u0131mlar Compose&#8217;un <code>deploy.resources<\/code> b\u00f6l\u00fcm\u00fcndeki limit ve rezervasyonlara kar\u015f\u0131l\u0131k gelir. Docker Swarm ve Kubernetes&#8217;te de benzer kavramlar vard\u0131r (Kubernetes&#8217;te <code>resources.requests\/limits<\/code>), bkz. <a href=\"https:\/\/konteynerium.com\/index.php\/2026\/06\/19\/kubernetes-temelleri-pod-deployment-service-nedir\/\">Kubernetes Temelleri<\/a>.<\/p>\n<h2>Pratik \u00f6neriler<\/h2>\n<ul>\n<li><strong>Her \u00fcretim container&#8217;\u0131na bellek limiti koyun.<\/strong> En az\u0131ndan <code>--memory<\/code>; &#8220;limitsiz&#8221; bir container kom\u015fular\u0131n\u0131 tehlikeye atar.<\/li>\n<li><strong><code>--memory-swap<\/code>&#8216;\u0131 <code>--memory<\/code> ile e\u015fitleyin<\/strong> (swap kapal\u0131): yava\u015f, \u00f6ng\u00f6r\u00fclemez swap davran\u0131\u015f\u0131 yerine h\u0131zl\u0131 ve net bir OOM tercih edilir.<\/li>\n<li><strong><code>--oom-kill-disable<\/code>&#8216;dan ka\u00e7\u0131n\u0131n.<\/strong> Yaln\u0131zca <code>--memory<\/code> ile birlikte kullan\u0131lmal\u0131d\u0131r; aksi halde host karars\u0131zla\u015fabilir.<\/li>\n<li><strong><code>--pids-limit<\/code><\/strong> ekleyin (\u00f6rn. 100\u2013500, uygulamaya g\u00f6re).<\/li>\n<li><strong>\u0130zleyin.<\/strong> Limitlere ne kadar yakla\u015ft\u0131\u011f\u0131n\u0131z\u0131 g\u00f6rmek i\u00e7in <a href=\"https:\/\/konteynerium.com\/index.php\/2026\/08\/21\/container-izleme-loglama-docker-stats-prometheus-grafana\/\">izleme ve loglama<\/a> kurun; OOM olaylar\u0131n\u0131 alarma ba\u011flay\u0131n.<\/li>\n<\/ul>\n<h2>H\u0131zl\u0131 kontrol listesi<\/h2>\n<ul>\n<li>Her servisin bellek ve CPU limiti tan\u0131ml\u0131 m\u0131?<\/li>\n<li>Swap devre d\u0131\u015f\u0131 m\u0131 (<code>memory-swap<\/code> = <code>memory<\/code>)?<\/li>\n<li><code>docker inspect<\/code> ile <code>OOMKilled<\/code> ge\u00e7mi\u015fi kontrol ediliyor mu?<\/li>\n<li><code>pids-limit<\/code> tan\u0131ml\u0131 m\u0131?<\/li>\n<\/ul>\n<p>G\u00fcvenlik a\u00e7\u0131s\u0131ndan kaynak limitleri, container izolasyonunun bir par\u00e7as\u0131d\u0131r; daha geni\u015f \u00e7er\u00e7eve i\u00e7in sitemizdeki <a href=\"https:\/\/konteynerium.com\/index.php\/container-guvenlik-sertlestirme-merkezi\/\">G\u00fcvenlik Merkezi<\/a> arac\u0131na bak\u0131n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bir container t\u00fcm sunucuyu \u00e7\u00f6kertmesin: &#8211;memory, &#8211;cpus ve &#8211;pids-limit ayarlar\u0131, OOM kill&#8217;in (\u00e7\u0131k\u0131\u015f kodu 137) nas\u0131l g\u00f6r\u00fcnd\u00fc\u011f\u00fc ve Compose&#8217;ta limit tan\u0131mlama, ger\u00e7ek \u00e7\u0131kt\u0131larla.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"seviye":[9],"class_list":["post-618","post","type-post","status-publish","format-standard","hentry","category-production-uygulamalar","seviye-ileri"],"_links":{"self":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/comments?post=618"}],"version-history":[{"count":0,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/618\/revisions"}],"wp:attachment":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/media?parent=618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/categories?post=618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/tags?post=618"},{"taxonomy":"seviye","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/seviye?post=618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}