Wielu ludzikom, którzy nie biorą na poważnie optymalizacji lub nie mają z nią potencjalnych problemów na codzień takie pojęcie jak profilowanie bywa długo obce. Mogą tylko się z tego cieszyć, bo w rękach ich bardziej doświadczonych kolegów od profilowania aplikacji spoczywa pewna magiczna moc.
Czasami bywamy pytani o to, jak można coś zrobić szybciej lub napisać tak, aby działało szybciej na tej samej maszynie. W sytuacji w której tematem optymalizacji jest jakiś nieskomplikowany język skryptowy typu Python, PHP, czy Ruby mamy do dyspozycji napisanie modułu w języku C. Zasadniczo te języki są napisane w C (C++) i zakładamy, że moduł napisany w języku źródłowym, w którym napisano dany język będzie szybszy. Sprawa się nieco komplikuje, gdy nie mamy takiego pomostu jak możliwość napisania kodu modułu w kodzie źródłowym języka. Jeszcze częściej nie mamy wpływu na sposób zarządzania pamięcią oraz wielowątkowością w danym języku skryptowym. Posłużę się dla przykładu językiem PHP, który posiada źródłową konwencję nazwaną Zend Engine. Jest to narzucony silnik stworzony poprzez firmę Zend i rozwijany przez deweloperów woluntariuszy na całym świecie. Niestety naleciałości, które ciągną się za nim od wielu lat ograniczają znacząco działanie tak istotnych mechanizmów języka jak wielowątkowość i odśmiecanie pamięci. Język ten w samych swoich źródłach jest pod tym kątem niedojrzały. Inna sytuacja jest w przypadku języka Python i Ruby. Słynna translacja języka Python w samym RPython (Restricted Python) - statycznym podzbiorze Pythona, który można skompilować do kodu bajtowgo Javy, CLR czy C, czyli projekt PyPy. Pozwala na bardzo rozwinięte horyzonty działania, które dla niewiedzących prowadzić mogą do definowania np: własnych zasad odśmiecania pamięci, sposobu działania wielowątkowości i całej gamy innych drobiazgów, które stawiają dość wysoko język Python na podeście :-) Nie znam dokładnie źródeł języka Ruby, ale widziałem, że są czytelne i można po nich wywnioskować, że doruwnuą projektowi takiemu jak Python, ale też zostawiają w tyle PHP Zend Engine.
Rozpisałem się o ogólnym spojrzeniu na źródła powszechnych języków skryptowych, aby naświetlić tylko, że dla niektórych języków temat optymalizacji, czyli profilowania na poziomie źródeł języka jest dość ograniczony. Lecz z kolei są takie języki skryptowe, które można profilować na poziomie wątków oraz zarządzania pamięcią. Projekty w ramach których dość czytelnie to zaprezentowano zawierają materiały dodatkowe. Wspomnę jeszcze, że nasz ulubiony googiel też się podpisuje do takich praktyk i posiada dość spore doświadczenie w tej materii. W soich serwerowniach dobierają procesory oraz z tego co mi wiadomo na farmach maszyn odbywa się również profilowane kompilowanego oprogramowania, aby jak najwięcej wycisnąć. Jest to jedna z nielicznych firm, która używa selekcjonowanych i wygrzewanych partii procesorów Pentium III oraz serwerownie stanowią klastry słabszych maszyn o przewidywalnej mocy obliczeniowej oraz przewidywalnym zużyciu energii. Skoro google udowodniło, że można nie kupować drogich serwerów IBM, czy Suna, czy tez HP jestem zgodny z nimi, że wówczas bez profilowania oraz optymalizacji zarówno hardware a przede wszystkim software nie wiele zdziałamy.
Przechodząc do części praktycznej chciałbym uchylić fragment tajemnicy przyspieszania aplikacji z Google Perftools. Materiał na temat przykładu profilowania znajdziecie tutaj.
Życzę pomyślnej lektury i zapraszam do podzielenia się refleksjami na ten temat.
Materiały dodatkowe:
Mastering the Art of Indexing
High Availability and Scalability Patches from Google
More on using Google Perftools with MySQL
Using the Google Perftools to speed up your MySQL server
Using the Google Perftools to speed up your MySQL server - example
Fast, multi-threaded malloc() and nifty performance analysis tools
Simple HTTP server for use with google-perftools pprof
TCMalloc : Thread-Caching Malloc
prof/PerfTools
This page describes how to setup and use PerfTools.
This CPU profiler used at Google
Spinlock
Practical Concurrency Patterns: Spinlock
Practical Concurrency Patterns: Lock-Free Operations
Spinlock example code
The performance of spin lock alternatives for shared-memory multiprocessors
HP - Spinlock Pool Parameter Summary
.NET Framework Class Library - SpinLock Structure
The Hoard Memory Allocator and Memory Management Studies
Generate Ruby Profiling Charts With Perftools
Profiling Ruby With Google’s Perftools
Distributed Innodb Caching with memcached
InnoDB: Innovative Technologies for Performance and Data Protection
Subskrybuj:
Komentarze do posta (Atom)
Brak komentarzy:
Prześlij komentarz