<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Cgroups on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/cgroups/</link>
        <description>Recent content in Cgroups on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 17 Mar 2026 09:00:00 +0100</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/cgroups/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Processi, risorse e cgroups</title>
        <link>https://www.matteobianchi.eu/p/processi-e-risorse-cgroups/</link>
        <pubDate>Tue, 17 Mar 2026 09:00:00 +0100</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/processi-e-risorse-cgroups/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/processi-e-risorse-cgroups/cover.png" alt="Featured image of post Processi, risorse e cgroups" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Non tutte le minacce arrivano da fuori. Un processo che apre file senza sosta, un servizio con una
memory leak, una fork bomb (accidentale o dolosa) possono esaurire CPU, RAM o la process table e
rendere il sistema inutilizzabile — un &lt;strong&gt;denial of service dall&amp;rsquo;interno&lt;/strong&gt;. L&amp;rsquo;hardening non è solo
chiudere porte: è anche garantire che nessun singolo processo o utente possa affamare gli altri. Lo
strumento del kernel per questo sono i &lt;strong&gt;cgroups&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;leggere-i-processi&#34;&gt;Leggere i processi
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps -eo pid,user,%cpu,%mem,rss,comm --sort&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-%mem &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head   &lt;span class=&#34;c1&#34;&gt;# chi consuma più RAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps -eo pid,user,nlwp,comm --sort&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-nlwp &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head            &lt;span class=&#34;c1&#34;&gt;# chi ha più thread&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;top -o %MEM                                              &lt;span class=&#34;c1&#34;&gt;# vista live, ordinata per memoria&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# /proc è la verità: ogni processo è una cartella&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /proc/&amp;lt;pid&amp;gt;/status &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -E &lt;span class=&#34;s1&#34;&gt;&amp;#39;VmRSS|Threads|Uid&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /proc/&amp;lt;pid&amp;gt;/fd &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; wc -l                             &lt;span class=&#34;c1&#34;&gt;# quanti file aperti&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;/proc&lt;/code&gt; è la finestra del kernel sui processi: lì leggi memoria reale, thread, file descriptor, limiti
e persino la riga di comando (&lt;code&gt;/proc/&amp;lt;pid&amp;gt;/cmdline&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;cgroups-i-limiti-del-kernel&#34;&gt;cgroups: i limiti del kernel
&lt;/h2&gt;&lt;p&gt;I &lt;strong&gt;control group&lt;/strong&gt; (v2 sui sistemi moderni) permettono al kernel di imporre tetti a CPU, memoria,
I/O e numero di processi per un gruppo. systemd li usa dietro le quinte e li espone come direttive: è
il modo più semplice di applicarli a un servizio.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# systemctl edit myapp.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MemoryMax=512M            # oltre, il processo viene killato (OOM) prima di affamare il sistema
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MemoryHigh=400M           # soglia &amp;#34;morbida&amp;#34;: il kernel rallenta il processo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CPUQuota=50%              # al massimo mezza CPU
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TasksMax=100              # al massimo 100 processi/thread → tappo alle fork bomb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;TasksMax&lt;/code&gt; è la difesa diretta contro le fork bomb: un servizio che tenta di creare migliaia di processi
sbatte contro il tetto invece di saturare la process table di tutto il sistema.&lt;/p&gt;
&lt;h2 id=&#34;verificare-i-limiti-in-azione&#34;&gt;Verificare i limiti in azione
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl show myapp.service -p MemoryMax -p TasksMax -p CPUQuota
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemd-cgtop                      &lt;span class=&#34;c1&#34;&gt;# vista live del consumo PER cgroup/servizio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /sys/fs/cgroup/system.slice/myapp.service/memory.current   &lt;span class=&#34;c1&#34;&gt;# memoria usata ora&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;limiti-per-utente-non-solo-per-servizio&#34;&gt;Limiti per utente, non solo per servizio
&lt;/h2&gt;&lt;p&gt;Per gli utenti interattivi, i limiti si impostano via &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/autenticazione-pam/&#34; &gt;pam_limits&lt;/a&gt; (&lt;code&gt;/etc/security/limits.conf&lt;/code&gt;) — tetti a processi e file aperti per
account — oppure via le slice di systemd (&lt;code&gt;user-&amp;lt;UID&amp;gt;.slice&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# /etc/security/limits.conf — tappo classico anti fork bomb per utente
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*    hard    nproc    2048
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;la-difesa-stratificata&#34;&gt;La difesa stratificata
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- limiti per-servizio  → MemoryMax/TasksMax/CPUQuota nelle unit (il più preciso)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- limiti per-utente    → limits.conf / user slice (copre le sessioni interattive)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- monitoraggio         → systemd-cgtop + alert quando un cgroup satura (vedi cap. logging)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Leggere i processi via &lt;code&gt;ps&lt;/code&gt; e &lt;code&gt;/proc&lt;/code&gt;, e imporre tetti con cgroups (&lt;code&gt;MemoryMax&lt;/code&gt;, &lt;code&gt;TasksMax&lt;/code&gt;, &lt;code&gt;CPUQuota&lt;/code&gt;)
impedisce che un singolo processo — buggato o malevolo — affami il sistema. Finora abbiamo lavorato
&amp;ldquo;dentro&amp;rdquo; la macchina; ora usciamo verso la rete, dove si decide cosa il mondo può raggiungere: il
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firewall-nftables/&#34; &gt;firewall con nftables&lt;/a&gt;, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
