Jak wyczyścić bufory We/Wy dysków w Linuksie

Muszę to zrobić dla bardziej przewidywalnego benchmarkingu.

 45
Author: palacsint, 2012-03-04

5 answers

Wygląda na to, że potrzebujesz komendy synclub funkcji sync().

Jeśli chcesz spłukać pamięć podręczną dysku: echo 3 | sudo tee /proc/sys/vm/drop_caches

 46
Author: Chris Dennett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 04:29:57

Możesz to zrobić tak:

# sync # (move data, modified through FS -> HDD cache) + flush HDD cache
# echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt)
# blockdev --flushbufs /dev/sda
# hdparm -F /dev/sda

# NEXT COMMAND IS NOT FOR BENCHMARKING:
# should be run before unplug, flushes everything possible guaranteed.
# echo 1 > /sys/block/sdX/device/delete

Możesz użyć strace, aby zobaczyć, że są to trzy różne syscalls

Również, może być pożądane, aby wyłączyć pamięć podręczną HDD za pomocą hdparm, Nie wiem, co benchmarking.

W żaden sposób nie można uniemożliwić dyskowi twardemu pamięci podręcznej ostatnich 64/32/16 MB ostatnio używanych danych. W celu zabicia tej pamięci podręcznej wystarczy napisać jakąś ilość zer (i spłukać) + odczytać jakieś niepowiązane miejsce z dysku twardego. Jest to wymagane, ponieważ cache może być podzielony na Read-part I napisz-część. Następnie możesz przetestować dysk twardy.

 27
Author: socketpair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-31 17:12:31

Oczyszczanie pamięci podręcznej dysku: echo 3 | sudo tee /proc/sys/vm/drop_caches

Dokumentacja polecenia: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Zapisanie tego spowoduje, że jądro usunie czyste pamięci podręczne, dentries i i-węzły z pamięci, powodując, że pamięć ta stanie się wolna.

Do free pagecache:

echo 1 > /proc/sys/vm/drop_caches

Aby uwolnić dentries i iPody:

echo 2 > /proc/sys/vm/drop_caches

Aby uwolnić pagecache, dentries i iPody:

echo 3 > /proc/sys/vm/drop_caches

Jako jest to nieniszcząca operacja, a brudne obiekty nie są wolne, Użytkownik powinien najpierw uruchomić "synchronizację", aby upewnić się, że wszystkie buforowane obiekty są zwolnione.

 18
Author: Piotr Jurkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-16 01:43:34

Krótka dobra odpowiedź: (copy paste friendly)

DISK=/dev/sdX # <===ADJUST THIS===
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK

Explanation:

sync: ze strony man: flush file system buffers. Wymuś zmianę bloków na dysk, zaktualizuj super blok.

echo 3 > /proc/sys/vm/drop_cache: z dokumentów jądra spowoduje to, że jądro upuści czyste pamięci podręczne

blockdev --flushbufs /dev/sda: ze strony man: wywołaj ioctls urządzenia blokowego [to] flush buffers.

hdparm -F /dev/sda: ze strony man: Flush bufor pamięci podręcznej zapisu na dysku (starsze dyski mogą tego nie implementować)

Chociaż polecenia blockdev i hdparm wyglądają podobnie zgodnie z powyższą odpowiedzią, wydają różne ioktle do urządzenia.

Long prawdopodobnie better way:

(zakładam, że sformatowałeś dysk, ale możesz dostosować te polecenia, jeśli chcesz pisać bezpośrednio na dysk)

Uruchom to tylko raz przed pierwszym benchmarkiem:

MOUNT=/mnt/test # <===ADJUST THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16

Uruchom to za każdym razem, gdy chcesz opróżnić pamięć podręczną:

DISK=/dev/sdX # <===ADJUST THIS===
MOUNT=/mnt/test # <===AND THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16
rm $MOUNT/temp-hddwrite.tmp
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
dd if=$MOUNT/temp-hddread.tmp of=/dev/null
Uruchom to, kiedy skończysz.
MOUNT=/mnt/test # <===ADJUST THIS===
rm $MOUNT/temp-hddread.tmp

Explanation:

Dysk twardy może mieć pamięci podręczne H/W, które nie zostaną wyczyszczone przez powyższe polecenia. Piszę i czytam pseudo-losowe DANE, aby wypełnić je śmieciami. Ilość danych zależy od wielkości pamięci podręcznej HDD. Używam /dev / urandom, ponieważ jest szybki i nie zależy nam na true losowości. Tworzę / mnt/test / temp-hddread.tmp z Uruchom i używaj go za każdym razem, gdy chcę przeczytać wystarczającą ilość losowych danych. Tworzę i usuwam /mnt/test/temp-hddwrite.tmp za każdym razem, gdy chcę napisać wystarczającą ilość losowych danych.

Kredyty

Napisałem tę odpowiedź na podstawie najlepszych części istniejących odpowiedzi.

 4
Author: ndemou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 15:44:15

Odmontowanie i ponowne zamontowanie testowanego dysku spowoduje zresetowanie wszystkich pamięci podręcznych i buforów.

 1
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 03:00:23