Puncte:0

goliți memoria cache de scriere doar dacă nu există activitate de citire

drapel in

În mod normal, kernelul Linux șterge memoria cache de scriere dacă este depășită o limită de timp specificată sau memoria cache este plină. Acest lucru duce la blocarea HDD-urilor, deoarece procesul de scriere face procesele de citire mult mai lente.

De aceea vreau să evit o golire a memoriei cache de scriere dacă există doar o mică activitate de citire. Din moment ce am 40 GB de RAM, aceasta nu ar trebui să fie o problemă. Gândurile mele despre asta ar fi să setez limita de timp la cinci minute, să reglez dimensiunea memoriei cache de scriere în funcție de nevoile tale și să scriu un script care șterge memoria cache DOAR dacă există 0 activitate de citire. Nu știu cum să fac asta, ar fi comanda shell sincronizare oferă performanțe suficient de bune?

Scopul meu este să am un cache de scriere cu o dimensiune de 1, 2 GB. Spălarea acestuia ar dura mult timp. Există ceva care poate fi oprit de îndată ce va fi din nou activitate de citire sau un disc PSI mai mare (ar reacționa suficient de repede?)

Am două unități Seagate (non-smr?): ST1000DM010-2EP102 - dar cred că aceste informații nu sunt necesare.

Cu dirty_raport Momentan am setat o dimensiune dinamică a memoriei cache.

echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs

Aceasta ar seta timpul maxim pentru a începe golirea memoriei cache de scriere la 1 oră.

Referinţă: https://unix.stackexchange.com/questions/30286/can-i-configure-my-linux-system-for-more-aggressive-file-system-caching

Comenzi utile:

Cu următoarea comandă puteți vedea cât este în memoria cache de scriere:

cat /proc/meminfo | grep Dirty

Ieșire:

Murdar: 104 kB

Dar asta nu este foarte important..

Unde sunt blocat?

Vreau să pot anula aproape instantaneu comanda de sincronizare (este chiar posibil) și vreau să știu dacă există o citire a procesului. De asta am nevoie pentru a scrie scenariul.

Am găsit un script vechi care poate monitoriza activitatea de citire: awk '{print $1}' /sys/block/sdb/stat

Cum să folosești asta?

if [ $veche-valoare -lt $noua-valoare];atunci COMANDA;fi
france1 avatar
drapel in
Este o dimensiune constantă a memoriei cache de scriere sau o valoare procentuală mai bună?
drapel jp
Răspunde asta la întrebarea ta? [Limitați spălarea fundalului Linux (pagini murdare)](https://serverfault.com/questions/126413/limit-linux-background-flush-dirty-pages)
france1 avatar
drapel in
Nu. Am văzut această postare, dar vor să seteze cache-ul de scriere cât mai scăzut posibil, nu asta este ceea ce îmbunătățește performanța pe hdd-uri.
france1 avatar
drapel in
https://www.kernel.org/doc/html/latest/block/stat.html - utilizați pentru /sys/block/sdb/stat
Puncte:0
drapel in

Surse folosite: https://askubuntu.com/questions/184204/how-do-i-fetch-only-numbers-in-grep https://www.kernel.org/doc/html/latest/block/stat.html https://askubuntu.com/questions/184204/how-do-i-fetch-only-numbers-in-grep

script pe care l-am codificat:

#!/bin/bash                                                                                                                                                                                                

vechile citiri=0
ucis=Adevărat
în timp ce (adevărat)
do
    citește=`awk '{print $1}' /sys/block/sdb/stat`
    if [ "$oldreads" == "$reads" ]
    atunci
        dacă [ $(grep -o '[[:digit:]]*'<<<$(cat /proc/meminfo | grep Dirty)) -gt 10240 ]
        atunci
            ecou "sincronizare"
            sincronizare&
            syncPid="$!"
            oldreads="$citește"
            ucis=fals
        altfel
            echo „Nu există mai mult de 10 MB în memoria tampon de scriere, nu se sincronizează.”
        fi
    elif [ $ucis == Fals ]
    atunci
         ecou "ucide"
         ucideți „$syncPid”
         ucis=Adevărat
    altfel
        echo „$oldreads => $reads”
        oldreads="$citește"
    fi
    somn 1
Terminat
france1 avatar
drapel in
Nu sunt sigur dacă comanda de sincronizare se oprește de fapt cu SIGINT :(
drapel in
Aceasta este soluția ta sau doar ceva ce ai încercat, dar tot nu funcționează?
drapel jp
uciderea `sync` nu ar face nimic.
france1 avatar
drapel in
Funcționează, dar așa cum a spus @AlexD, oprirea sincronizării nu funcționează. Pot folosi altceva care reacționează la semnalul 15?

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.