Figyelem, ezen cikk erős, negatív kifejezéseket használ mindenki kedvenc gányolt rendszerével kapcsolatosan! Mezei pingvintöcskölők, csak nyugtatóval olvassák.
Korábban futottam pár kört a linux távoli managementje témakörben. Mostani történetünk a Linux memóriakezeléséről szól. Pontosabban annak nem kezeléséről. Vagyis fogalmazzunk úgy, hogy azon kreatív megoldásokról amivel a felhasználót szivatják kernel oldalról.
Történetünk főszereplője egy kukaszerver, P2@400Mhz, 64 MB, 1GB swap. Mint ilyen egy szépen összekonfigurált apache, mysql, X, és digitalizáló módban futó mplayerrel kényelmesen belak 59MB-ot. Tehát még marad 5 MB ami két és félszerese egyes grafikus operációs rendszerek futtatásához szükséges memóriaigénynek, de ez ne zavarjon minket. Az élet, szép és jó. A ventillátorok csendben duruzsolnak, stb, stb, stb.
Mivel egy átlag felhasználó (aka én), szeretné fűtésen kívül másra is használni napi 24 órában ketyegő gépét, ezért - minő aljas cselekedet - elindít egy torrent klienst, ami grafikus lévén gyorsan be is ránt 132MB(!)-ot. Ugyebár ez még egy fdivbug előtti processzor, ezért rövig osztás, szorzás után kioszt 128MB swap-et, 4MB memóriát és mindenki boldog vala.
Ekkor a felhasználó (aka én) úgy dönt, hogy áthelyezi a webkamerát, tehát leállítja az mplayert, kilövi a kamera modult, kihúzza a kamerát és odébbteszi. Ugyebár ekkor a kernel felszabadítja a fentiek által foglalt memóriát, felszabadítja a swapet és kiosztja a többi processznek. Hát egy lófaszt. A felszabadított memóriát kiosztja a többi processznek és a swaphez hozzá sem nyúl.
A felhasználó (aka én), miután végzett a kameramozgatással visszadugja a kamerát, amihez a kernel betölti a modult. A felhasználó (aka én) ezután elindítja az mplayert ami el is száll. Vajon mivel?
v4l2 ioctl error: Cannot allocate memory
Hopszi. Ez bizony szopás. Vessünk csak egy pillantást a memóriára. 63MB normál memória és 151MB swap foglalt. Tehát tetvérek közt is 850Mb swap van szabadon.
Ízlelgessük egy kicsit a fenti hibaüzenetet: v4l2 ioctl error
Tehát a hibát a kernel modul dobja és nem az mplayer. A kernel egy kernel modulnak nem tud memóriát foglalni a működéséhez, mert az userspace programok elfoglalják. Hihetetlen, hova fejlődik a technika... De az is lehet, hogy ez egy processz védelmi eljárás! Biztos bekapcsoltam az emo kernel featuret fordításnál, és most nem akarja megbántani a userspace programokat azzal, hogy swapbe teszi őket.
Nosza, segítsünk neki! Lőjjünk ki egy processzt, legyen mondjuk a mysql. Hopszi, lett is hirtelen 8MB hely, az-az csak volt mert a kernel kiosztotta a futó processzeknek. Indítsuk el az mplayert, mi a válasz?
v4l2 ioctl error: Cannot allocate memory
Lőjjünk ki még pát processzt, mondjuk a ktorrentet, és az apache-ot. Futni fog az mplayer?
v4l2 ioctl error: Cannot allocate memory
Mi van a memóriában? 47MB normál memória, 136MB swap foglalva, a többi szabadon.
Kapcsoljuk ki a swapet és vissza. 47MB normál memória, a többi szabadon. Lőjjük ki a v4l modult, húzzuk le a kamerát, kössük vissza.
Eredmény?
v4l2 ioctl error: Cannot allocate memory
Igen kérem, ez a fényévekkel a technológia előtt járó, kattingedzs linux kernel, mely keptelen 7 MB-ból 1MB memóriát allokálni. Nevezhetnénk ezt a technológiát akár plug-and-sucksnak.
Mi marad tehát? Windows módszer. Szálljunk ki és szálljunk vissza. Reset, reboot. És csodák csodája, megy a digitalizálás 5MB szabad hellyel. Indítsuk el a ktorrentet. Ez is megy. Fantasztikus, nem?
Próbáljuk meg másképp. Reboot. Modul ki, kamera le. Kamera vissza. Hopszi, megy a digitalizálás. Modul ki, kamera le. Kamera vissza. Még mindig megy a kamera.
Indítsunk pár alkalmazást, fogyjon el a valós memória. Modul ki, kamera le. Kamera vissza. Eredmény?
v4l2 ioctl error: Cannot allocate memory
Ürítsük ki a memóriát. Modul ki, kamera le. Kamera vissza. Eredmény?
v4l2 ioctl error: Cannot allocate memory
Sokszor szídják a kernel fejlesztőket, hogy nem konzisztensek. Nos ez esetben szó nem érheti őket, hiszen 2.6.26, 2.6.31 és 2.6.32-n is ugyanazt csinálja. Bár feltételezem, hogy az erőforrásaik javarészét az foglalta le, hogy 2.6.26-ról sikerüljön 2.6.31-ig elbaszni, majd 2.6.32-re megjavítani a uvcvideo modult.