[megoldva] loop device - lassú

Fórumok

Van egy merevlemezem, amelyen X offszetnél van egy Y méretű fájlrendszer. (ext4, de most a hangsúly nem ezen lesz)

a.) Csinálok egy partíciót X offszetnél, Y mérettel. Nevezzük csak /dev/sda1-nek.
b.) Csinálok egy loop device-t ugyanezen X offszetnél, Y mérettel. (losetup --offset X --size-limit Y ...) Nevezzük csak /dev/loop0-nak.

Ha a /dev/sda1-et csatolom fel, akkor ~110 MByte/sec sebességgel tudok nagy fájlokat írni a fájlrendszerre. Ha ugyanezt a fájlrendszert /dev/loop0-ként csatolom fel, akkor ~35 MByte/sec sebességgel tudom írni.

Értem én, hogy nagy a loop device overhead-je, na de ennyire? ... és, lehet-e valamit javítani a helyzeten?

Ha a /dev/sda1-et csatolom fel, akkor írás esetén folyamatosan ég a HDD LED, ha a /dev/loop0-t csatolom fel, akkor szakaszosan ég a HDD LED. Nyilván először teleír valami buffer cache-t, aztán meg flush-ol, na, de le lehet-e erről beszélni?

Ez most egy homokozó környezet, az éles rendszeren rá vagyok kényszerítve a loop device használatára, nem tudok partíciót létrehozni.

UPDATE: a megoldás loop device helyett a device mapper használata "linear" módban. Kösz, Árpi!

Hozzászólások

Szerintem ez normális.

http://www.silug.org/lists/silug-discuss/200502/msg00061.html

"Remember that the system is processing the data twice in the loopback." Ez ugye alapból felezi a sebességet, a többi veszteség meg az extra processzorhasználatból keletkezhet.

Nézd meg, hogy mi lehet a szűk keresztmetszet, pl. figyeld a load-ot, memóriahasználatot és az iostat kimenetét másolás közben.

> "Remember that the system is processing the data twice in the loopback."
> Ez ugye alapból felezi a sebességet, a többi veszteség meg az extra processzorhasználatból keletkezhet.

Felezi, de mit? A rendszerem képes GByte/sec sebességgel adatot mozgatni. A szűk keresztmetszet a merevlemez, ami kb. 110 MByte/sec-et tud. A loop device nem merevlemez-szinten működik, tehát attól, hogy loop device-on keresztül mozgatom az adatot, attól még a merevlemeznek nem kell kétszer annyi adatot mozgatnia. A rendszernek kell, na de annak röhögve ki kellene bírnia.

Másrészt, látom is a HDD LED-en, hogy kb. 50%-ban a diszk "unatkozik", tehát szakaszosan jut csak el hozzá a kiírandó adat.

A processzorhasználat gyakorlatilag nulla. Amikor az idő kb. felében ténylegesen ír a diszk, akkor van iowait, de az teljesen normális is.

Az egyik lehetséges problémaforrás, ha az I/O kéréseket nem olyan méretben küldi a rendszer az egyik vagy a másik esetben (pl. az adott réteg kötelezően lebontja a kéréseket egy adott méret alá, vagy nem engedi összeszedni a kéréseket, mert egyedileg kezeli őket, esetleg nincs megfelelő read-ahead támogatás).
A másik probléma lehet, ha valamiért jelentősen megnöveli a latency-t egy rosszul megtervezett architektúrával, mivel az egy szálon dolgozó programok (a legtöbb program bizony ilyen) sávszélességének felső korlátja a max. kérésméret * a latency.

Igen, kb erről van szó, a loop leszűkíti a párhuzamos kérések számát egy konstans maximumra, amitől a mögötte lévő IO scheduler nem tud rendesen optimalizálni.

Ha egy app a szekvenciális olvasást maximum PAGE_SIZE request mérettel bonyolítja, ez igen fájdalmas lesz (a request merge csak a loop device után jön). Ez nem ritka.

AFAIK

felejtsd el a loop-ot! mi is szoptunk vele, tobb parhuzamos iras/olvasasnal ultragaz de amugy se kapkodos.
anno utanaolvasgattam es azt irtak, hogy az a baj, hogy az osszes cache, szinkron iras, stb elveszik.

az ajanlott, tamogatott megoldas erre a device mapper, azzal is lehet offsetelni szepen, es az korrektul mukodik.

OFFSET=16384

X=$(blockdev --getsize $1)
let X=X-$OFFSET

echo 0 $X linear $1 $OFFSET | dmsetup create "$3"

Ha a /dev/sda1-et csatolom fel, akkor ~110 MByte/sec sebességgel tudok nagy fájlokat írni a fájlrendszerre. Ha ugyanezt a fájlrendszert /dev/loop0-ként csatolom fel, akkor ~35 MByte/sec sebességgel tudom írni.

110/pi = 35 !!!

--

Kíváncsi vagyok, miért nem lehet partíciót létrehoznod.

mount-nak emlékeim szerint lehet közvetlenül offset paramétert adni. Ez is loop interfészen csinálja? Ez is annyit lassít?

mount -t ext4 /dev/sda /mnt -o offset=65536