Cache beim direkten Zugriff auf Block-Device

  • Weiß jemand, ob beim direkten Zugriff auf ein Block-Device (z.B. eine SD-Card in /dev/sde) etwas gecache'd wird, oder die Daten direkt auf das Device geschrieben bzw. von dort gelesen werden?


    Hintergrund: ich teste gerade einige SD-Cards und schreibe sie dazu mit zufällig generierten Daten voll und lese diese wieder zurück, um sie mit den original Daten zu vergleichen. Wenn da beim Lesen etwas aus dem Cache käme, wäre das natürlich kontraproduktiv...


    <edit>

    Schreiben und Lesen erfolgt mit 'dd', also z.B. 'dd if=randomfile of=/dev/sde'.

    Das Device ist also nicht gemountet.

    </edit>


    Klaus

  • hdparm -W /dev/sde sollte den Cache abschalten


    vdr-User-# 755 to_h264 chk_r

  • Das bezieht sich vermutlich auf ein eventuelles Caching in der SD-Karte selber, oder?

    Code
    1. root> hdparm -W /dev/sde
    2. /dev/sde:
    3. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00
    4. write-caching = not supported

    Wichtiger wäre mir zu wissen, ob der Kernel da was cache'd, denn in einem System mit 32GB RAM passt ein 8GB Drive locker rein ;-).


    Klaus

  • Ich sehe gerade, es muss heissen


    hdparm -W 0 /dev/sde


    Code
    1. /dev/sde:
    2. setting drive write-caching to 0 (off)
    3. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    4. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    5. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    6. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    7. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    8. write-caching = not supported

    Dem "write-caching = not supported" entnehme ich aber mal, daß die Karte gar kein Write-Caching unterstützt.

    Bleibt die Frage, wie man sicherstellen kann, daß der Kernel nichts puffert, oder wie man nach dem Schreiben dafür sorgen kann, daß ein eventueller Puffer verworfen wird und alle folgenden Lese-Operationen wirklich physikalisch von der SD-Karte lesen.


    Klaus

  • Code
    1. # echo 3 >/proc/sys/vm/drop_caches

    3 = Bitmaske, Bit 0 (1) = Pagecache, Bit 1 (2) = Dentries and Inodes. Auf https://unix.stackexchange.com…d-cache-on-a-linux-system gibts 'ne ausführliche Erklärung :-)

    Server: Gigabyte P35-DS4, Intel Core2Duo E6850, 4GB DDR2-RAM (Headless), Gentoo Linux x86_64 / Kernel 4.13.9 / DD CineCTv6+DuoFlex C/T/T2+DuoFlex C/C2/T/T2 w/Kernel Stock Drivers / TVHeadend-GIT-3356759d8

    HTPC: Gigabyte GA-EG41MF-US2H, Intel Core2Duo E7500, 2GB DDR2-RAM, NVIDIA GT610/1GB PCIe in Antec Fusion Remote Black+SoundGraph iMON LCD ( 0038 )
    SW: Kodi Krypton+Leia auf allerlei Gerätchen (HTPC: VDPAU+HD-Audio+LCDproc addon / Ubuntu Trusty 14.04 (x86_64), RPi2, NVIDIA Shield Android TV, Wetek Play 1@LibreELEC/NAND, Tablets, Smartphones, Win/Mac/Linux Desktops)

  • Hallo Klaus,


    ich meine, die Option iflag=direct sollte den dd dazu bringen, am Read-Cache vorbei zu lesen, also z.B.:


    Code
    1. dd if=/dev/sde iflag=direct of=randomfile

  • Wichtiger wäre mir zu wissen, ob der Kernel da was cache'd, denn in einem System mit 32GB RAM passt ein 8GB Drive locker rein ;-).

    Wenn ich das noch recht erinnere ist der "grosse" Cache auf Dateisystemebene.


    Bei dd cachen allenfalls Treiber und Hardware etwas.

    Anderenfalls könnte ich mir die grossen Unterschiede, die bei Festplatten, bei verändern der Blockgrösse, auftreten, nicht erklären.

    Gruss
    SHF


  • Vielen Dank für die Tipps!


    Ich habe das jetzt mal ausprobiert und mit 'free' beobachtet.


    Also "echo 3 >/proc/sys/vm/drop_caches" löscht die Buffer (allerdings alle, also auch die von anderen Platten).


    "iflag=direct" sorgt dafür, daß gar nicht erst gepuffert wird.


    Somit ist letzteres das, was ich brauche :-).


    Klaus

  • PS: es gibt auch noch ein oflag=direct, je nachdem wo halt nicht gecached werden soll :)


    Edit: hdparm -Wx schaltet den Write Cache, der auf einer Festplatte sitzt, ein/aus ...