vm.swappiness sembra ignorata

Salve.
Uso Fedora 20 da dicembre.
il pc ha 4GB di ram ed ho preferito usare uno swapfile (/file_swap collocato in root) anziché una partizione swap, specificando in /etc/fstab

...
/file_swap       none       swap      sw       0       0
...

Ora, mi sono accorto che, mentre virtualizzavo su VBox altri S.O., il sistema iniziava a swappare abbastanza tardi

Allora ho fatto delle prove al volo con valori molto diversi di tale variabile, quali:

sysctl -w vm.swappiness=90
sysctl -w vm.swappiness=50
sysctl -w vm.swappiness=10

ma il comportamento è rimasto invariato.
Può dipendere dal fatto che uso un file di swap?

Per quale ragione usare uno swap file?

principalmente per una questione di flessibilità.
Non è qualcosa di importante, ma qualcosa che io trovo più comodo come altri possono trovare scomodo o poco conveniente.
Ora, il fatto è che vorrei capire se lo strano comportamento dipende da questo o no, magari qualcun altro ha avuto esperienze del genere in tal senso.

Dimenticavo… dopo aver settato la swappiness controllo sempre che la modifica sia andata a buon fine con:

sysctl -q vm.swappiness

Avrei novità in merito…
non sono per niente sicuro che le versioni recenti di Fedora considerino la variabile vm.swappiness: il sistema indipendentemente da come la si setti swappa poco, troppo tardi quando si voglia virtualizzare sistemi su pc per esempio come il mio con 4GB di Ram; è come se Fedora fosse settato per ottenere le massime prestazioni, sebbene di default vm.swappiness sembri settata a 60. Insomma se si spinge molto l’oom è in agguato.
MA…
ho scoperto tuned, un tool sviluppato da Red Hat per Fedora/RHEL/CentOS che attua una configurazione adattiva sul sistema in accordo con un profilo selezionato dall’amministratore.
Ho settato tuned sul profilo balanced (che poi è quello predefinito) ho spremuto la macchina facendole sfruttare più di 800 MB di swapfile e non ho avuto out-of-memory alcuno.

Il problema per me è risolto, resta però il mistero… anche agli altri settare vm.swappiness a 0 o 100 non fa differenza?

Non viene ignorato, ma la grossa differenza si sente quando il sistema arriva nei pressi del riempimento della memoria.

Sarei curioso di capire perché desideri usare uno swap file invece della RAM, perché di solito le persone provano a fare l’esatto contrario. In parole povere tu vorresti usare la swap tenendo libera parte della RAM? C’è un modo per fare quello che richiedi tu, grazie ad un modulo del kernel di Linux e ad un paio di comandi, ma prima sono curioso di conoscere la risposta :smiley: (non giudicherò, poi ti assicuro che comunque vada ti darò quest’altra soluzione ;))

Non trovo il programma da te citato, hai qualche link?

Altri parametri interessanti: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Quoto frafra, non vedo nessuna motivazione logica nell’usare uno swapfile.

Allora, capisco che posso essermi espresso male, e comprendo la diversità delle posizioni in merito.

Cerco di rispondere con ordine.
Premessa necessaria è dire chiaramente cosa voglio fare con la macchina in uso:
virtualizzare os con virtualbox e la macchina in uso ha solo 4GB di RAM, che praticamente saturo (virtualizzando con VirtualBox).

Altra premessa:
che si tratti di partizione swap dedicata o swapfile non fa differenza, il comportamento è lo stesso e l’ho notato anzi per la prima volta proprio su parzione swap :slight_smile:

[quote=frafra]Non viene ignorato, ma la grossa differenza si sente quando il sistema arriva nei pressi del riempimento della memoria.

Sarei curioso di capire perché desideri usare uno swap file invece della RAM, perché di solito le persone provano a fare l’esatto contrario. In parole povere tu vorresti usare la swap tenendo libera parte della RAM? C’è un modo per fare quello che richiedi tu, grazie ad un modulo del kernel di Linux e ad un paio di comandi, ma prima sono curioso di conoscere la risposta :smiley: (non giudicherò, poi ti assicuro che comunque vada ti darò quest’altra soluzione ;))[/quote]

Esatto, la vm.swappiness regola la tendenza a swappare: si può settare da 0 a 100, più alta è più il sistema tende ad usare la swap.
Su Debian e Ubuntu (che ho alla versione 14.04) questa variabile l’ho settata come sempre (da anni) a 25 e il sistema inizia a swappare quando le applicazioni hanno saturato circa 2,9 GB così che mi resta circa 1GB libero da usare nell’immediato. Questo è proprio quello che voglio: riservarmi un GB di Ram per evitare un freeze del sistema, se avessi più ram ovviamente cercherei anch’io di sfruttarla ritardando lo swapping :slight_smile:
Con fedora inizio a swappare quando restano appena 200MB liberi e questo mi crea problemi

[quote=frafra]Non trovo il programma da te citato, hai qualche link?

Altri parametri interessanti: https://www.kernel.org/doc/Documentation/sysctl/vm.txt[/quote]

Tuned è un demone di cui c’è tanto di documentazione ufficiale:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Power_Management_Guide/Tuned.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Performance_Tuning_Guide/index.html#id2929235

https://fedorahosted.org/tuned/

Non mi meraviglierei che sulle releases recenti (19+) la configurazione dei parametri relativi alla gestione della potenza fossero stati interamente demandati a questo/i tools

Una partizione di swap è una partizione, non ha la flessibilità di un file di swap, ok può essere ridimensionata o cancellata, ma sai che smadonnamenti se qualcosa va storto!
Dello swapfile ci fai quello che vuoi, io ho esperienza di entrambi.
Hai mai provato ad usare la soluzione dello swapfile?
Passando all’avvio al kernel i parametri resume e resume_offset si riesce regolarmente ad ibernare e ripristinare la sessione. :wink:

[ot]
Anch’io ho porvato a creare uno swap_file invece dell’uso della “canonica” partizione di swap sperando in un incremento delle performances; però a livello pratico non vedi differenze. Beh per esempio può servire quando il disco è pieno e magari aggiungi moduli ram allora per permettere l’ibernazione, senza toccare le partizioni crei uno swap_file aggiuntivo.
Non ricordo dove posi questo problema, ma (penso) esperti mi dissero che in windows e mac lo swapfile invece di essere in partizione dedicata viene creata nel filesystem del SO stesso (anche se però diciamocelo se Mac pretende di definirsi “Unix” beh ha sbagliato proprio strada ‘sto “scroccatore” di software con licenza BSD) :D. Ma chi mi rispose mi disse che lo vedevano come un “gap” (ovvero avere swap in rootfs è peggio di aver na partizione dedicata :roll:).
Effettivamente lo swapping per Linux rallenta, se “intenso”, notevolmente le prestazioni globali del sistema. e sinceramente anche modificando i vari parametri in sysctl.conf (vm.swappines, dirty_ratio, https://access.redhat.com/documentation/en-US/Red_Hat_Directory_Server/8.2/html/Performance_Tuning_Guide/system-tuning.html)
Purtroppo se il problema non dipende da programmi che "impazziscono ed usano ram in modo spropositato e tu hai bisogno di usare software “avido di RAM… l’unica è aggiungere moduli ram”, anche se sinceramente anche a me da fastidio questa lentezza della swap. Spero che nei successivi kernels vi sia un miglioramento netto dell’ I/O Ram/swap).
Ciao… e scusa se magari ho “rotto”

Ok, grazie per la spiegazione :slight_smile:
Eccoti qui la mia proposte

zram

Questo modulo ti permette di creare dei dispositivi a blocchi nella ram, formattarli come se fossero swap, principalmente al fine di comprimere con poca fatica i dati volatili e di ridurre l’utilizzo di memoria. Fin qui tu mi dirai: e a me che importa? Adesso ti spiego: tu puoi creare una partizione swap da un gb in ram, e dare a questa, quando la monti, una priorità inferiore. Così facendo, prima sarà usata la ram non compressa, poi la swap su disco, e infine quella su ram compressa. Ma tu in realtà non vuoi questo, dico bene? Vorresti che un gruppo di processi usasse quasi esclusivamente la swap. E allora via con la seconda soluzione…

cgroups

E’ possibile creare un gruppo di uno o più processi e limitare l’uso di ram utilizzata. Non è fantastico?

[code]# yum install libcgroup-tools

cgcreate -g memory:vm

cgclassify -g memory:vm $(pidof VirtualBox)

echo $((1024102410)) > /sys/fs/cgroup/memory/vm/memory.limit_in_bytes[/code]

Superati i 10 MB, verrà usata solo la swap. Ovviamente puoi rendere queste impostazioni persistenti e avviare direttamente un programma facendolo far parte di un gruppo grazie a cgexec. E’ uno strumento molto potente, col quale puoi limitare anche l’uso della cpu e settare, per gruppo o sottogruppo, altri parametri interessanti, inclusa la swappiness.

https://www.kernel.org/doc/Documentation/cgroups/memory.txt
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-memory.html

Accidenti … spero di non venir considerato “prezzemolo” :(.
Però (non so da che versione), già a livello kernel vien fatta la compressione per swap.
Per esempio mi sembrano interessanti

*] Enable frontswap to cache swap pages if tmem is present 

Il cui “help” è

CONFIG_FRONTSWAP:                                                       │  
  │                                                                         │  
  │ Frontswap is so named because it can be thought of as the opposite      │  
  │ of a "backing" store for a swap device.  The data is stored into        │  
  │ "transcendent memory", memory that is not directly accessible or        │  
  │ addressable by the kernel and is of unknown and possibly                │  
  │ time-varying size.  When space in transcendent memory is available,     │  
  │ a significant swap I/O reduction may be achieved.  When none is         │  
  │ available, all frontswap calls are reduced to a single pointer-         │  
  │ compare-against-NULL resulting in a negligible performance hit          │  
  │ and swap data is stored as normal on the matching swap device.          │  
  │                                                                         │  
  │ If unsure, say Y to enable frontswap.

Inoltre:

*] Compressed cache for swap pages (EXPERIMENTAL)

col relativo “help”:

│ CONFIG_ZSWAP: │ │ │ │ A lightweight compressed cache for swap pages. It takes │ │ pages that are in the process of being swapped out and attempts to │ │ compress them into a dynamically allocated RAM-based memory pool. │ │ This can result in a significant I/O reduction on swap device and, │ │ in the case where decompressing from RAM is faster that swap device │ │ reads, can also improve workload performance. │ │ │ │ This is marked experimental because it is a new feature (as of │ │ v3.11) that interacts heavily with memory reclaim. While these │ │ interactions don't cause any known issues on simple memory setups, │ │ they have not be fully explored on the large set of potential │ │ configurations and workloads that exist. .

:roll: mi sento un po’ confuso …

[quote=Sandro1972]…

Inoltre:

*] Compressed cache for swap pages (EXPERIMENTAL)

col relativo “help”:

│ CONFIG_ZSWAP: │ │ │ │ A lightweight compressed cache for swap pages. It takes │ │ pages that are in the process of being swapped out and attempts to │ │ compress them into a dynamically allocated RAM-based memory pool. │ │ This can result in a significant I/O reduction on swap device and, │ │ in the case where decompressing from RAM is faster that swap device │ │ reads, can also improve workload performance. │ │ │ │ This is marked experimental because it is a new feature (as of │ │ v3.11) that interacts heavily with memory reclaim. While these │ │ interactions don't cause any known issues on simple memory setups, │ │ they have not be fully explored on the large set of potential │ │ configurations and workloads that exist. .

:roll: mi sento un po’ confuso …[/quote]

E come non esserlo!
Però questo mi fa pensare che ho ragione quando mi pare che il comportamento di Ubuntu, nelle stessissime situazioni, è un po’ (tanto) diverso, nel senso che è più sensibile nel complesso a come viene settato vm.swappiness…
Cioè il punto in cui Fedora swappa realmente è “spostato più in alto”, più al limite comunque… pur non essendo ignorata vm.swappiness
E infatti a parità di swappiness (sulla stessa macchina), ubuntu inizia a swappare e a “soffrire” prima, Fedora invece swappa molto dopo e inizia a “soffrire” molto più tardi, tanto che se non si sta facendo attenzione a come son messe le risorse, virtualizzando può accadere di ritrovarsi con una macchina guest andata oom senza aver avuto avvisaglie di chissà quale rallentamento
In pratica il risultato è che Fedora alla fine non freeza, Ubuntu spesso sì :slight_smile:
Potrebbe dipendere da queste features sperimentali che Fedora ha attive su kernel recenti.

frafra, ti ringrazio di questi suggerimenti. In particolare mi interessa il secondo, ma non ho avuto tempo di provarlo e vista l’ora non mi ci azzardo nemmeno.
Anche perché già nel pieno della notte una fesseria l’ho detta per tuned: i suoi profili non fanno altro che settare i soliti parametri tra cui anche vm.swappiness a determinati valori che si ritengono opportuni in determinati usi, quindi niente di nuovo :sorry:

Chiedo scusa se mi sono perso qualche parte importa di questo thread, ma non riesco a capire il problema, se io ho 4GB di Ram è questi vengono saturati, il sistema per continuare a sodisfare le richieste di memoria, manda in swap delle pagine rss.

Linux swappa in due condizioni:
1: quando c’e mancanza di memoria.
2: in situazioni normale, ma che ci sono pagine pocco acedute.

Lo swappines server a controllare il comportamento del secondo punto