RPI3 gpio log

Üdv!
RP3 gpio-ra csatlakoztatott hardware elemek állapotát kellene loggolnom, és hébe-hóba megjelenítenem-módosítanom webes felületen. Az eszközök másodpercenként lennének lekérdezve, az adatokat viszont csak változás esetén rögzíteném. Ezközönként kb 25byte adat keletkezik, ez legrosszabb esetben napi ~2,2MB adatmennyiségnek felel meg.
Mivel az RPI3 háttértárja SD kártya, elgondolkodtam, hogy a másodpercenkénti adatmentegetés nem vágja-e rövid idő alatt gallyra a kártyát?
Elsőre azt törpöltem, hogy a logger script egy változóban tárolja a lekérdezések eredményét és óránként csinál egy dumpot a háttértárra. Viszont a webes lekérdezések ebben az esetben az utolsó óra adatait nem látják, csak dump után.
Gondolom született már erre valami megoldás, ami ennél sokkal megbízhatóbb. Pl. nem lehet a kernel által bizonyos állományokat a RAMban tükrözni, és pl óránként szinkronizálni a fizikai állománnyal?
Kösz, Bálint

Hozzászólások

tmpfs a gyujtesnek aztan idonkent sync SD-re?

Igen, van másik lehetőség, pl. kiolvassa a script az aktuális értéket, majd megnézi, hogy változott-e az érték a fájlban letárolthoz képest. Ha igen, akkor lementi, ha nem, akkor nem változtat semmit.

Nekem RPi2-m van, egy sima külső SSD-re raktam át mindent, az SD kártyán csak a /boot van. SSD-t nem nyírja ki a MySQL sem :) Figyelem! Tápellátásnak nem elég az RPI USB lába.

tultolod... egy 32G-os sd kartyanal legyen mondjuk a szabad hely 28G, ezt a napi 2.5 mega adattal, ~11500 nap alatt tudod megtolteni, ez 31 ev :)

persze ne minden adatot kulon fajlba tarolj, meg mondjuk a lekerdezo progi is osszevarhat egy blocknyi adatot, es akkor egyben irja ki (ha nem gond pl egy aram miatti pici adatvesztes),
stb

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Kösz, azt hiszem egyenlőre ezen az úton megyek.
Esetleg ha meg tudom oldani, hogy a logger script észlelje, mikor csatlakoznak a kütyühöz weben, akkor az óránként helyett másodpercenként fogok fájlba menteni.
Valaki esetleg tud lehetőséget a webfelület kezelő php script és a logger script közötti adatátvitelre valamelyik környezeti változón, illetve bármilyen RAM-hoz köthető megoldások keresztül?

Szerinte nem. Az a gond, hogy 25 byte-os darabokban történik az írás. (Feltételezzük, hogy folyamatosan nyitva van a file descriptor, nem pedig shell scriptből echo '' >> módszerrel írásonként újranyit/újrazár, akkor sokkal több lehet a tényleges írás). Erre a filerendszerben egy 4kB-os blokk íródik felül. A flashnek pedig ki tudja mekkora a valós belső blokkmérete, de hogy manapság >=16kB elég tipikus. Ez úgy sacc/kb 650x-es write amplification. Erre rájön még a sd kártya kontroller belső wear levelling, garbage collection és hasonló belső housekeeping tevékenysége, ami további 1.1x-10x write amplification-t rátesz, ezt elég nehéz becsülni, sd kártyáknál tudtommal mérni sem lehet. Ezzel nem számolok.
Ez napi szinten 1.31GB valós írás, vagyis 24 nap alatt a 32GB-os SD kártya egy teljes írási cikluson lesz túl. Végülis elviselhető, egy normális minőségű SD kártya 100-200 ciklust ki kell bírjon, ami még mindig több év (viszont a gagyibbak sokkal hamarabb beadhatják a kulcsot), de azért látszik, hogy szükségtelenül gyorsan eszi a flash-t.
Azzal már sokat lehet javítani, ha nem minden kiírás után jön fsync, így a kernel puffereléssel össze tud várni több egymás utáni adatot. A fájlrendszer default commit intervalluma fogja meghatározni, hogy max mennyi időt vár (viszont ennyi adatot bukhatsz, ha elmegy az áram). 30sec-es commit interval esetén már csak 21x-es a write amplification, ez azért lényegesen elviselhetőbb.
A lényeg, hogy figyelni kell hogyan írod a fájlt.
---
Régóta vágyok én, az androidok mezonkincsére már!

nem vagyok jartas az ilyen mini bizbaszok vilagaban, de elso keresesre talaltam egy ilyet: https://www.adafruit.com/product/1897
ezzel (vagy valami hasonloval) szepen eltarol egy blocknyi adatot, aztan irhato is ki sd-re.

de eleve ha fontos az adat, akkor nem pi+sd kartyaval tokolnek, ha meg nem fontos akkor siman osszevarhato par percnyi (ha jol szamolom akkor 3 perc alatt osszejon 4k egy eszkozbol masodperces lekerdezessel, tobb eszkoznel meg gyorsabban) adat a ramban, ha meg aram kimaradas van akkor ugyse ez a 3 percnyi fog hianyozni, hanem az aramszunet alatti 20 perc...

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Esetleg valamilyen felhős szolgáltatás használata elképzelhető? Mondjuk az adafruit.io, mely elérhető REST API-n vagy MQTT-n. De ha nem akarsz (nem annyira) publikust, vannak teljesen privát servert biztosító szolgáltatók is.

Ave, Saabi.