3. Miről lesz szó?
•
Optimalizálásról általában
•
Hasznos segédeszközök
•
Teljesítmény tesztelés
•
Gyakorlati példák
•
syslog-ng tapasztalatok
4. Optimalizáció 1x1
• Optimalizálási célok:
• CPU használat
• Memória használat
• Disk használat
• “sebesség” - futási idő
• Skálázódás
• Energia hatékonyság
• Költségek!
5. Módszerek
• Adatszerkezetek és algoritmusok kiválasztása
• Cél az O(1) :)
• Komplex rendszerek esetén különösen fontos a
megfelelő architektúra kiválasztása
• Optimalizáció vs. Hordozhatóság vs. Olvashatóság
• Mikro-optimalizálások sokat tudnak számítani
• Tudomány vagy művészet?
6. Slow- és fast-path
•
Nem kell mindig mindent optimalizálni
•
Átlagos és maximális eset nem mindig esik
egybe!
•
Érdemes lehet a kivételeket külön, slow-path-
on kezelni!
•
Egy gyors fast-path és egy elég jó slow-path
lehet optimális megoldás
7. Pár szó a hardverről
CPU feldolgozási sebesség jelentősen növekedett
Memória méret, használható address space is megnőtt
Jellemzően több processzoros, több magos rendszerek
Processzor jóval gyorsabb, mint a memória, disk elérés
Virtualizált, cloud megoldásoknál nem a “miénk” a teljes gép
Beágyazott és mobil eszközök továbbra is különlegesek
8. Teljesítmény tesztelés
• Stresszteszt
• Hogyan viselkedik a rendszer nagy terhelés esetén?
• Teljesítmény mérés - eredmények
• Mérőszámok meghatározása
• Különböző bemeneti minták és beállítások tesztelése
• Micro-benchmark
• A program egy-egy kritikus részének folyamatos
tesztelése
• Regresziók felderítésére nagyon hasznos!
9. Eszközök
• Találgatás helyett érdemes mérni!
• Legjobb barátunk a profiler!
• Rendszer-szintű mérőszámok is sokat segíthetnek
• Pár hasznos segédprogram
• Oprofile, perf, valgrind, pahole, gprof/gcov, time
10. Optimalizáljunk!
• Feladat:
– Szöveges fájl felolvasása
– Soronként szöveg tokenizálása és tokenek
számlálása, beépített naplózással
• Cél:
– Lehető legyorsabb futás
• Nincs többszálúsítás!
• Mit tegyünk?
11. Memória használat
•
Van, hogy a programunk túl sok memóriát
eszik...
•
Valami sokat foglal?
•
Valamilyen objektumból túl sok van?
•
Valamit elfelejtünk felszabadítani?
•
Hogyan fogjunk neki?
12. syslog-ng queue-k
• Cél: szálak között üzenetek átadása, sorrend
helyesen, nagy mennyiségben
• Triviális megoldás:
– Queue használata lockolással
• Probléma:
– Nagy lock overhead
– Sok várakozás üres, vagy teli queue esetén
13. syslog-ng queue-k
•
Több queue használata, batch szerűen
•
Lock nélküli fast-path és lock-olt slow-path
Producer queue Consumer queue
Wait queue
Lock Lock
14. syslog-ng patterndb
•
Cél:
– Bejövő különböző szöveges üzenetek real-
time feldolgozása, klasszifikációja
Legelterjedtebb megoldás a regexp-ek
használata.
– Sok minta esetén lassú és nehezen
karbantartható
Accepted publickey for marci from 127.0.0.1 port 37126 ssh2
15. syslog-ng patterndb
•
Célok:
– Mintaillesztés ne függjön nagyban a
minták számától
– Egyszerű minta szintakszis
•
Megoldás:
– Kereső fa építése a minták alapján
– Változó részekhez “parserek” használata
Accepted publickey for @STRING:username@ from
@IPv4:source@ port @NUMBER:port@ ssh2
16. syslog-ng patterndb
•
Radix fa “literal” és “parser” elemekkel
•
Közel független a minták számától
Accepted publickey for
STRING: username
from
IPv4: source
port
17. Konkluzió
•
Segédeszközök használata sokat könnyíthet
•
Folyamatos ellenőrzés, regressziók felderítése
•
Nem érdemes mindent sebességre
optimalizálni
•
Folyamatos tanulás, tervezés fontossága
•
Környezet sajátosságaira érdemes figyelni
•
Használjuk az eszünket! :)
18. Kérdések?
Köszönöm a figyelmet!
Illés Márton
illes.marton@balabit.hu
http://marci.blogs.balabit.com/