Puncte:2

Cum să muți automat schimbul înapoi în RAM?

drapel cn

Problema mea inițială cu swap (piness) a fost că schimbă prea des (chiar și cu schimbul=1! ).

De asemenea, m-am gândit că 0 va dezactiva schimbul - care era a concepție greșită,
Schimbarea funcționează în continuare chiar dacă ați setat sudo sysctl -w vm.swappiness=0 ! :-)
(Pentru a seta permanent, editați /etc/sysctl.conf și adăugați/actualizați vm.schimbări = 0 - pentru editorul de text GUI recomand un „linux notepad” „gedit”, apoi puteți face sudo gedit /etc/sysctl.conf)

Doar cu schimburi 0 a început să se comporte mai mult așa cum s-a așteptat (schimbarea începând cu aproximativ 98% din RAM plină), cu toate acestea încă mai întâmpin o problemă - și că atunci când suficientă RAM este eliberată din nou, schimbul nu revine automat la RAM, nici măcar în timp.

Desigur, puteți face manual sudo swapoff -a; sudo swapon -a de fiecare dată când dezactivează schimbul, ceea ce în cele din urmă forțează schimbul să fie golit în RAM și apoi schimbul începe din nou.

Cu toate acestea, este neplăcut din 2 motive: a) schimbul este oprit pentru un moment b) este o verificare/rulare suplimentară manuală

Există vreo modalitate de a realiza acest lucru în unele, de preferință "nativ", cale automat?

Raffa avatar
drapel jp
Pentru verificare automată: `[ "$(free | awk '/Swap:/{print $3}')" -lt "$(free | awk '/Mem:/{print $7}')" ] ​​&& echo "Memorie liberă swap mai mult decât folosit” || echo „Memorie liberă mai mică decât schimbul folosit”`
user535733 avatar
drapel cn
Nucleul returnează într-adevăr paginile de schimb utilizate frecvent înapoi în RAM. Nu returnează rapid paginile utilizate rar... pentru că sunt folosite rar, așa că schimbarea este o locație potrivită pentru ele. Dacă utilizați un sistem constrâns de RAM, nu priviți schimbarea ca fiind doar un depășire pentru când memoria RAM este plină. Vedeți schimbul ca o formă diferită de memorie cu caracteristici diferite.
heynnema avatar
drapel ru
Editează-ți întrebarea și arată-mi `free -h` și `swapon -s` și `sysctl vm.swappiness`.
jave.web avatar
drapel cn
@user535733 problema este că am niște lucruri de care s-ar putea să nu am nevoie în acest moment, dar am nevoie de ele să fie gata când merg acolo - schimbul este într-adevăr doar o pauză sigură pentru mine (deci am timp să-l omor pe dreapta proces când încep să înregistrez prea mulți GB în RAM)
Puncte:3
drapel cn

Afaik, nu este disponibilă nicio setare pentru a schimba tendința de a returna paginile schimbate în RAM. Dacă doriți, puteți lucra cu un script care verifică RAM și SWAP și dezactivează/reactivează swap atunci când este în siguranță. Pe un sistem cu memorie limitată, acest lucru poate fi niciodată: singura opțiune de a șterge memoria schimbată este să închideți procesele care le dețin.

Nu este clar care vor fi beneficiile pentru a muta imediat SWAP înapoi în RAM ori de câte ori este posibil. Linux gestionează automat schimbul. Dacă nu eliberează schimbul ocupat, se datorează faptului că memoria schimbată nu este necesară și, prin urmare, poate rămâne fericit pe disc până când este nevoie. În acest fel, timpul de RAM și procesor este economisit pentru utilizarea aplicațiilor acolo unde contează. Discul dumneavoastră este economisit deoarece operațiunile de swap sunt minimizate.

Cât de repede intervine schimbul depinde de dvs schimbul setare, dar depinde și de cantitatea de RAM pe care o aveți. Nu ai menționat cantitatea de RAM pe care o ai. Pe baza experienței dvs., se poate presupune că fie aveți puțină memorie RAM (poate 2 GB sau mai puțin), fie că utilizați aplicații specifice care au nevoi de memorie neobișnuite.

În primul caz, poate fi necesar să vă schimbați obiceiurile de utilizare a computerului pentru a ține cont de limitările RAM scăzută, până când puteți actualiza memoria RAM fizică. Swap nu este în niciun caz o înlocuire a memoriei RAM, este doar un truc pentru a o extinde oarecum și a permite ceva mai mult pe un sistem RAM limitat.

În cel de-al doilea caz, apoi lăsați-l în pace: sistemul dumneavoastră se comportă optim, schimbând RAM nefolosită pentru a o lăsa în sarcina muncii dvs. de acumulare a memoriei.

jave.web avatar
drapel cn
Problema este că am niște lucruri de care s-ar putea să nu am nevoie în acest moment, dar am nevoie de ele să fie gata când merg acolo - schimbul este într-adevăr doar o pauză sigură pentru mine, așa că am timp să opresc procesul potrivit atunci când Încep să trag prea mulți GB în RAM, ceea ce se întâmplă sau chiar trebuie să fac destul de regulat. (si nu as numi asta un truc) BTW: Simt că doar ultimul paragraf răspunde cu adevărat la întrebare. De asemenea, văd că această tendință de schimb de răspunsuri evită inevitabilul - există o problemă care are nevoie de o soluție (care poate să nu existe încă, dar problema rămâne). :-)
vanadium avatar
drapel cn
Prima parte este de a sugera că ceea ce considerați că este posibil problema nu este problema. În cele din urmă, concluzia este: cumpărați suficientă RAM pentru nevoile dvs. Nicio altă abordare nu te va ajuta cu adevărat. Chiar ai adăugat câteva informații despre cantitatea de RAM cu care te lupți? Văd că, între timp, cineva a fost destul de amabil să-ți scrie scenariul pe care l-am menționat.
vanadium avatar
drapel cn
Am mutat „răspunsul” în partea de sus ;)
jave.web avatar
drapel cn
Este o altă tendință care nu-mi place - „cumpără X”, mi s-a părut evident (îmi pare rău dacă nu a fost), dacă aș putea să cumpăr/ să fac upgrade la suficientă RAM, nu aș întreba asta. Îmi pare rău că nu am furnizat informațiile despre RAM - există 2 carcase - 16 GB și 32 GB. Nu mă înțelege greșit, sunt foarte bucuros că ești dispus să ajuți :) doar puțin dezamăgit de abordarea internetului față de oamenii care au nevoie de soluții pentru situația lor actuală
jave.web avatar
drapel cn
Oricum, pentru cazul meu în special, actualizarea RAM nu ar fi oricum o opțiune, deoarece nu are aceleași consecințe **comportamentale** (cum am descris în primul meu comentariu) și supraîncărcările RAM pe care le prind cu swap poate fi **practic nelimitat** :)
vanadium avatar
drapel cn
Îți înțeleg nevoia, dar nu „de ce” nevoia ta, iar întrebarea ta nu clarifică acest lucru, deoarece documentezi cu greu cazul specific de utilizare care poate duce la situația ta. Dacă cineva nu vine cu ceva mai bun, așa cum este în prezent, trebuie să implementați singur un script, așa cum am indicat în acest răspuns. Văd că între timp ați acceptat răspunsul celui care a furnizat scenariul.
jave.web avatar
drapel cn
Deși nu am documentat cazul de utilizare, cred că am descris destul de clar nevoia și lucrurile pe care le fac deja, ceea ce implică că am trecut deja prin întrebările și răspunsurile comune, așa că am găsit cea mai mare parte din răspunsul tău în afara subiectului - să fie clar - acesta este motivul pentru care nu l-am acceptat, **nu** din cauza lipsei de cod. Dar dacă sunteți interesat - cazul generalizat de utilizare sunt scurgeri aleatorii de memorie/gunoi din cache generate de aplicații pe care nu le pot controla deloc, dar se întâmplă din când în când și când generez lucruri folosind memoria RAM intenționat, dar cu date care pot conține imprevizibilitate :)
jave.web avatar
drapel cn
Totuși, mulțumesc pentru contribuție, nu vreau să par nerecunoscător :)
Puncte:1
drapel jp

Dacă trebuie să o faci, atunci swapoff este calea de urmat. Puteți automatiza acest proces prin implementarea unui script bash astfel:

#!/bin/bash

sysctl -w vm.swappiness=0

în timp ce adevărat
do
    total_m=$(gratuit | awk '/Mem:/{printează $2}')
    free_m=$(gratuit | awk '/Mem:/{print $7}') 
    used_s=$(gratuit | awk '/Swap:/{print $3}')
    total_m_percent=$((„$total_m” / 100))
    free_m_percent=$(("$free_m" / "$total_m_procent"))
    # Dezactivați schimbul și mutați paginile în RAM dacă există suficient spațiu în RAM și RAM liberă este mai mare de 30%
    [ "$used_s" -gt 0 ] && [ "$used_s" -lt "$free_m" ] && [ "$free_m_percent" -gt 30 ] && swapoff -a
    # Activați schimbul dacă RAM liberă rămasă devine mai mică de 5%
    [ "$used_s" -eq 0 ] && [ "$free_m_percent" -lt 5 ] && swapon -a
    # Dormiți timp de 10 secunde pentru a evita încordarea sistemului
    dormi 10
Terminat

Rulați scriptul cu sudo bash scriptfile.sh sau adăugați o systemd serviciu pentru a rula scriptul automat când sistemul pornește.

jave.web avatar
drapel cn
Pare interesant - deci nu există nicio modalitate de a muta doar lucrurile schimbate fără schimb? :(
Raffa avatar
drapel jp
@jave.web [Gestionarea memoriei](https://www.kernel.org/doc/html/latest/admin-guide/mm/index.html) este complicată și vitală pentru sistem ⦠Nucleul Linux ia ai grijă de asta foarte bine… Deci, lucrul înțelept de făcut este să „schimbi” și să lași magia să se întâmple :) ⦠âexistă o altă cale? mod â Mă îndoiesc... Scriptul din răspunsul meu este pregătit special pentru a răspunde cerințelor dvs. și ar trebui să ruleze impecabil ca un serviciu `systemd`.
muru avatar
drapel us
Revizuirea codului: atunci când atribuiți o înlocuire de comandă unei variabile (`var=$(foo)`), ghilimelele nu sunt necesare în jurul înlocuirii comenzii (dar nu strica). Dar când folosiți o variabilă într-o comandă, `[ "$used_s" ...]` variabila ar trebui să fie citată.
Raffa avatar
drapel jp
@muru Vă mulțumim pentru revizuirea codului dvs., sunt total de acord cu dvs. asupra conceptului de bună practică... Cu toate acestea, sunt așteptate doar valori numerice în acele variabile, așa că nu sunt necesare ghilimele în jurul acelor variabile (dar nu doare). .. Văd îngrijorarea dvs. cu privire la `$used_s`, dar chiar și cu swap dezactivat, această variabilă va conține valoarea numerică a lui `0` ... Opinia dvs. despre această chestiune, totuși, are o pondere mai mare pe partea dreaptă :)
Raffa avatar
drapel jp
@muru A trebuit să editez și să adaug `[ "$used_s" -gt 0 ]` și `[ "$used_s" -eq 0 ]` pentru a preveni lansarea inutilă a comenzilor `swapoff` / `swapon`... Am găsit și eu este o șansă de a rezolva afacerea cu ghilimele pe drum :) ... Apreciez opinia ta și mulțumesc din nou.
jave.web avatar
drapel cn
@Raffa Mă întrebam doar dacă kernel-ul poate muta lucruri din RAM în schimb dacă o poate face invers într-un fel, păstrând schimbul activat în cazul în care o altă memorie uriașă începe să fie alocată :)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.