<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>InnerVision TechBlog &#187; tuning</title>
	<atom:link href="http://techblog.innervision.pl/tag/tuning/feed/" rel="self" type="application/rss+xml" />
	<link>http://techblog.innervision.pl</link>
	<description>Technologie informacyjne po naszemu</description>
	<lastBuildDate>Tue, 19 Apr 2011 14:03:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>revProxy, czyli jak zoptymalizować serwis WWW</title>
		<link>http://techblog.innervision.pl/2011/04/19/revproxy-czyli-jak-zoptymalizowac-serwis-www/</link>
		<comments>http://techblog.innervision.pl/2011/04/19/revproxy-czyli-jak-zoptymalizowac-serwis-www/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 14:03:25 +0000</pubDate>
		<dc:creator>Piotr Rybicki</dc:creator>
				<category><![CDATA[Technikalia]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[porady]]></category>
		<category><![CDATA[revProxy]]></category>
		<category><![CDATA[tuning]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[wydajność]]></category>

		<guid isPermaLink="false">http://techblog.innervision.pl/?p=179</guid>
		<description><![CDATA[Profesjonalny serwis WWW, aby ładował się błyskawicznie, używa różnych mechanizmów do zapamiętania całej strony lub jej elementów. Niektórzy wykorzystują do tego tzw. serwer STATIC, czyli osobny serwer WWW zoptymalizowany do obsługi dużej ilości statycznych plików. To podejście jest słuszne, natomiast bardziej elastycznym rozwiązaniem jest zastosowanie serwera Reverse Proxy u dostawcy usług hostingowych. Czym jest revProxy? [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://techblog.innervision.pl/wp-content/uploads/2011/04/revproxy1.jpg"><img class="alignleft size-thumbnail wp-image-246" title="revproxy" src="http://techblog.innervision.pl/wp-content/uploads/2011/04/revproxy1-150x150.jpg" alt="" width="150" height="150" /></a>Profesjonalny serwis WWW, aby ładował się błyskawicznie, używa różnych mechanizmów do zapamiętania całej strony lub jej elementów. Niektórzy wykorzystują do tego tzw. serwer STATIC, czyli osobny serwer WWW zoptymalizowany do obsługi dużej ilości statycznych plików. To podejście jest słuszne, natomiast bardziej elastycznym rozwiązaniem jest zastosowanie serwera Reverse Proxy u dostawcy usług hostingowych.</p>
<p><strong>Czym jest revProxy?</strong></p>
<p>Serwer revProxy znajduje się pomiędzy jednym lub kilkoma serwerami WWW a klientem przeglądającym stronę. Żądania wyświetlenia strony trafiają najpierw do revProxy, który (o ile już nie posiada ważnej kopii) pobiera element z serwera WWW (jak np. strona HTML, obrazek czy CSS) i zapisuje go w swojej pamięci.  Jeśli pojawia się żądanie o ten sam element, do klienta zostaje wysłana kopia zamiast oryginalnego elementu z serwera WWW. Główną zaletą takiego scenariusza jest zmniejszenie obciążenia na serwerach WWW, a tym samym szybsze ładowanie stron.</p>
<p><strong>Czy revProxy jest rozwiązaniem dla mnie?</strong></p>
<p>Opisywana technologia jest niestety mało popularna, a szkoda.  Poza koniecznością zaznajomienia się z mechanizmami sterującymi działaniem revProxy, występuje obawa, że straci się informacje na temat statystyk serwisu. W praktyce jednak, sterowanie revProxy jest proste, a statystyki można generować na podstawie np. kodu JavaScript zamiast logu serwera WWW.</p>
<p>Istnieje również niebezpieczeństwo, że w przypadku awarii serwera revProxy, strona przestanie się wyświetlać. Przy zastosowaniu odpowiednich rozwiązań load-balancer, infrastruktura może być odporna na taką awarię i w przypadku problemów z funkcjonowaniem revProxy,  cały ruch automatycznie zostanie przekierowany bezpośrednio na serwery WWW, lub na inny serwer revProxy.</p>
<p>Ekonomiczna zaleta tej technologii jest dość oczywista. Zmniejszenie obciążenia serwerów WWW, oznacza mniejszą ilość serwerów WWW, co prowadzi do mniejszych kosztów utrzymania.</p>
<p><strong>Jak działa procedura korzystania z cache w revProxy?</strong></p>
<p>W dużym uproszczeniu, wymieniamy poniżej kilka głównych zasad, którymi należy się kierować:</p>
<ul>
<li>Jeśli nagłówki odpowiedzi HTTP zawierają instrukcje aby nie cache-ować obiektu, nie będzie on cache-owany.</li>
<li>Jeśli obiekt jest autoryzowany, bądź bezpieczny (HTTPS), nie będzie cache-owany.</li>
<li>Obiektu w cache jest uznawany za świeży, jeśli posiada informacje o okresie świeżości i ten okres nie minął.</li>
<li>Jeśli obiekt nie jest uznany za świeży,  revProxy odwoła się do serwera WWW i pobierze nową wersję obiektu, lub oznaczy obiekt jako niezmieniony i nadal świeży.</li>
</ul>
<p>W przypadku, gdy obiekt nie zawiera informacji o walidacji (nagłówek ETag lub Last-Modified) oraz nie posiada dokładnego określenia co do swojego okresu ważności, w większości przypadków taki obiekt zostanie uznany za nie cache-owalny. Określenie świeżości obiektu oraz informacji o jego walidacji stanowią podstawę przy wdrażaniu revProxy do serwisu WWW.</p>
<p><strong>Jak sterować revProxy z poziomu serwisu WWW?</strong></p>
<ul>
<li><strong>Meta tag w HTML</strong></li>
</ul>
<p>Informacje zawarte w treści obiektu HTTP z pewnością nie wpłyną na działanie revProxy, ponieważ tylko nagłówki są brane pod uwagę. Meta tagi mogą być przydatne do kontroli cache w przeglądarce, ale to też nie we wszystkich przeglądarkach. <em>Nie należy stosować tej metody do sterowania działaniem revProxy</em></p>
<ul>
<li><strong>Nagłówek odpowiedzi &#8216;Pragma&#8217; dla HTTP 1.0<br />
</strong></li>
</ul>
<p>W sieci można znaleźć porady, aby stosować nagłówek HTTP &#8216;Pragma: no-cache&#8217;, aby zabezpieczyć obiekt przed cache-owaniem.  Ta metoda kontroli nad cache była stosowana za czasów protokołu HTTP 1.0 . Można oczywiście używać tego nagłówka jako dodatkowego, ale dobrze administrowany serwer revProxy będzie używał protokołu HTTP 1.1 i ten nagłówek będzie zbędny, oraz może prowadzić do problemów w przypadku rozbieżności w ustawieniach pozostałych nagłówków. <em>Nie zalecamy stosowania nagłówków Pragma.</em></p>
<ul>
<li><strong>Nagłówek odpowiedzi &#8216;Expires&#8217; dla HTTP 1.0<br />
</strong></li>
</ul>
<p>Nagłówek ten wysłany z serwera WWW jest jednym ze sposobów na sterowaniem walidacją obiektów w revProxy. Przykład nagłówka:</p>
<blockquote><p>Expires: Fri, 30 Oct 2011 14:19:41 GMT</p></blockquote>
<p>Jak widać, nagłówek przyjmuje wartość daty (koniecznie w formacie GMT), zatem idealnie nadaje się do ustalenia ważności obiektu jako konkretny moment w czasie. Ponieważ nagłówek pochodzi z czasów HTTP 1.0, <em>nie zalecamy stosowania tego nagłówka.</em></p>
<ul>
<li><strong>Nagłówek odpowiedzi &#8216;Cache-Control&#8217; dla HTTP 1.1<br />
</strong></li>
</ul>
<p>Od momentu pojawienia się standardu HTTP 1.1, pojawiła się o wiele bardziej elastyczna metoda na kontrolę revProxy, w postaci tego nagłówka. Przykład:</p>
<blockquote><p>Cache-Control: max-age=3600, must-revalidate</p></blockquote>
<p>Poniżej kilka przydatnych opcji wartości nagłówka:</p>
<ul>
<li style="text-align: left;"><strong>max-age=</strong>(sekundy). Określa maksymalną ilość czasu, dla którego dany obiekt będzie świeży. Funkcjonalność podobna do nagłówka &#8216;Expires&#8217;, z tą jednak różnicą, że tu podajemy ilość sekund a nie moment w czasie.</li>
<li style="text-align: left;"><strong>s-max-age=</strong>(sekundy). Opcja podobna do max-age, jednak odnosi się wyłącznie do wspólnych (shared) cache, jak np revProxy, ale już nie do prywatnych (private) jak np. cache przeglądarki konkretnego użytkownika.</li>
<li style="text-align: left;"><strong>public</strong>. Użycie tej opcji informuje revProxy o tym, że może cache-ować dany obiekt, nawet jeśli klient został zautoryzowany. Jeśli np. mamy do czynienia ze stroną, do której należy się zalogować, revProxy standardowo nie zachowa tej strony. Przy użyciu tej opcji, revProxy zachowa taką stronę w cache.</li>
<li style="text-align: left;"><strong>private</strong>. Ta opcja powoduje, iż obiekt jest przeznaczony wyłącznie dla danego użytkownika i będzie mógł zostać zapisany w cache przeglądarki danego użytkownika, natomiast nie może on zostać zapamiętany w revProxy i dostępny dla wszystkich.</li>
<li style="text-align: left;"><strong>no-cache</strong>. Użycie tej opcji powoduje wymuszenie w revProxy sprawdzenia obiektu na serwerze revProxy, za każdym razem. Jeśli obiekt przechodzi walidację (pobrany z serwera WWW jest taki sam jak w cache), to klient otrzymuje kopię bez pobierania z revProxy, a w przeciwnym razie obiekt zostanie w całości pobrany z serwera WWW.</li>
<li style="text-align: left;"><strong>no-store</strong>. Ta opcja wyłącza całkowicie jakiekolwiek przechowywanie obiektu w cache i powoduje za każdym razem pobranie obiektu od serwera WWW przez revProxy do klienta.</li>
<li style="text-align: left;"><strong>must-revalidate</strong>. Dzięki tej opcji, można wymusić, aby obiekt który stracił ważność, bezwzględnie został odświeżony z serwera WWW. Serwer revProxy może w szczególnych przypadkach przesłać obiekt, który stracił ważność (np w przypadku problemu ze skontaktowaniem się z serwerem WWW).</li>
</ul>
<p>Zbiór wszystkich nagłówków i opcji jest określony <a title="HTTP 1.1 Specification" href="http://www.ietf.org/rfc/rfc2616.txt" target="_blank">w dokumencie RFC</a> na temat specyfikacji protokołu HTTP 1.1</p>
<ul>
<li><strong>Nagłówek odpowiedzi &#8216;Vary&#8217; dla HTTP 1.1<br />
</strong></li>
</ul>
<p>Nagłówek ten jest wymagany do poprawnego funkcjonowania mechanizmów revProxy. Określa on inne nagłówki, których wartości stanowią kryteria dla wyboru wersji obiektu. Minimalną wartością dla nagłówka &#8216;Vary&#8217; jest : Accept-Encoding, aby rozróżnić wersję obiektu, który jest np. skompresowany i nie skompresowany. Nie należy podawać nadmiernej ilości nagłówków, ponieważ prowadzi to do przeciążenia revProxy identycznymi obiektami w wielu instancjach (np. ten sam obrazek, ale przechowywany w cache dla każdej wartości nagłówka User-Agent).</p>
<ul>
<li><strong>Walidacja obiektów</strong></li>
</ul>
<p>Proces, podczas którego revProxy sprawdza, czy obiekt w jego cache jest taki sam jak na serwerze WWW, nazywa się właśnie walidacją. Jeśli walidacja się powiedzie, revProxy nie musi pobierać całego obiektu od serwera WWW. Zapewnienie możliwości walidacji jest niezmiernie ważnym elementem podczas dostosowywania serwisu WWW do możliwości skorzystania z revProxy. Popularnym walidatorem jest nagłówek odpowiedzi HTTP &#8216;Last-Modified&#8217;.  Podobnie jak &#8216;Expires&#8217;, określa moment w czasie, gdy obiekt został zmodyfikowany. Jeśli data &#8216;Last-Modified&#8217; jest późniejsza niż data w której obiekt został pobrany z serwera WWW, obiekt nie przechodzi walidacji i jest pobierany w całości ze źródłowego serwera WWW.</p>
<p>Protokół HTTP 1.1 zdefiniował nowy nagłówek odpowiedzi &#8211; &#8216;ETag&#8217;. Wartość tego nagłówka jest identyfikatorem jednoznacznie określającym wersję obiektu (zawartość obiektu, czas modyfikacji, etc).</p>
<p><strong>Jak sprawdzić nagłówki z mojej strony WWW?</strong></p>
<p>Doskonałym serwisem, który umożliwia sprawdzenie nagłówki oraz ich interpretację jest <a title="REDbot" href="http://redbot.org/" target="_blank">REDbot.org</a>.</p>
<p>Powodzenia przy dostosowywaniu swojej strony WWW <img src='http://techblog.innervision.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.innervision.pl/2011/04/19/revproxy-czyli-jak-zoptymalizowac-serwis-www/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load Average &#8211; o co chodzi?</title>
		<link>http://techblog.innervision.pl/2009/11/13/load-average-o-co-chodzi/</link>
		<comments>http://techblog.innervision.pl/2009/11/13/load-average-o-co-chodzi/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 23:00:47 +0000</pubDate>
		<dc:creator>Piotr Rybicki</dc:creator>
				<category><![CDATA[Technikalia]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[system operacyjny]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://techblog.innervision.pl/?p=39</guid>
		<description><![CDATA[W mojej karierze zdarzyło mi się kilkakrotnie rozmawiać z kandydatami na stanowisko Linux/Unix admina. Szybko odkryłem, że odpowiedzi na pytanie &#8216;Co to jest Load Average&#8217; zaczynają być nie tyle nie trafione, co zabawne. Mało kto potrafił odpowiedzieć w taki sposób, żeby dało się wyczuć, że wie o czym mówi. Spróbuję więc wyjaśnić pokrótce co to [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-41" title="putty" src="http://techblog.innervision.pl/wp-content/uploads/2009/10/putty-150x150.PNG" alt="putty" width="150" height="150" />W mojej karierze zdarzyło mi się kilkakrotnie rozmawiać z kandydatami na stanowisko Linux/Unix admina. Szybko odkryłem, że odpowiedzi na pytanie &#8216;Co to jest Load Average&#8217; zaczynają być nie tyle nie trafione, co zabawne. Mało kto potrafił odpowiedzieć w taki sposób, żeby dało się wyczuć, że wie o czym mówi. Spróbuję więc wyjaśnić pokrótce co to jest.</p>
<p>Moja definicja tego parametru to: Średnia ilość procesów w kolejce do wykonania w okresie, odpowiednio 1, 5 i 15 minut. Innymi słowy, jest to miara obciążenia systemu procesami. Anglojęzyczni czytelnicy mogą również przeczytać definicję na <a href="http://en.wikipedia.org/wiki/Load_%28computing%29" target="_blank">wikipedii</a>.</p>
<p>Jak wiadomo, Unix jest systemem wielozadaniowym, czyli np. jest w stanie niby &#8216;jednocześnie&#8217; wykonywać kilka procesów. Jeśli tych procesów mamy kilka, to trafiają one do odpowiedniej kolejki (we FreeBSD nazywa się ona <em>runnable</em>) i stamtąd mechanizm zarządzania dostępem do zasobów (<em>sheduler</em>), decyduje który proces ma otrzymać czas procesora, a który ma czekać. Ilość procesów w tej kolejce mierzona jako średnia, w trzech wspomnianych okresach, jest właśnie wartością Load Average.</p>
<p>A co się dzieje w przypadku, gdy np. mamy kilka procesów, które chcą działać jednocześnie? To mi przypomina moje pytanie &#8216;pomocnicze&#8217; zadane jednemu z kandydatów:</p>
<ul>
<li>Ile procesów może działać jednocześnie na jednym procesorze, i do tego (jakby to miało jakiekolwiek znaczenie) 64 bitowym?</li>
<li>(chwila zastanowienia i pada odpowiedź) 1024!</li>
<li>Taaak? A dlaczego?</li>
<li>A nie, &#8230; (znów chwila zastanowienia): 4096!</li>
<li>Ok, przejdźmy do następnego pytania&#8230;</li>
</ul>
<p>Oczywiście nie da się na jednym procesorze (1 rdzeń, bez obsługi wielowątkowości i zakładamy że jest to &#8221;zwykły&#8217; procesor dla jasności) wykonywać jednocześnie kilku procesów. W danej chwili może działać co najwyżej jeden proces, a reszta czeka na swoją kolej.</p>
<p>Warto zdać sobie sprawę z faktu, że to, że proces istnieje w systemie, nie musi koniecznie oznaczać że ma on dostęp do zasobów (CPU). Weźmy np. uruchomiony proces serwera apache, wraz z procesami potomnymi. Jeśli nikt z niego nie korzysta, po prostu sobie jest, ale nic nie robi poza oczekiwaniem na żądania. Przykładowe procesy serwera nie znajdują się więc w kolejce do wykonania.</p>
<p>No dobrze, to teraz jaka wartość Load Averago to dużo? To oczywiście zależy ile mamy procesorów. Jeśli mamy 2 CPU a każdy po 4 rdzenie, to mamy w sumie tych rdzeni 8. W takim przypadku jeśli parametr LA dochodzi do wartości 8, to jest to wartość graniczna po której procesy nie będą działać optymalnie, ponieważ w danym przedziale czasu jest więcej procesów oczekujących na wykonanie niż dostępnych procesorów. Skutkiem tego będzie odbieranie dostępu do procesorów obecnie działającym procesom i przekazanie tego dostępu innym znajdującym się w kolejce do wykonania. Tak naprawdę, to trzeba jeszcze odliczyć trochę mocy na pracę samego systemu.</p>
<p>Na koniec ciekawostka: W Linuxie sprawa wygląda trochę inaczej niż we FreeBSD, a mianowicie proces który czeka na dane z podsystemu I/O też jest wliczany do  LA.  Z punktu widzenia procesu w Linuxie jest tak, że to przecież nie jego, tylko sytemu, wina że potrzebne do działania dane nie znajdują się jeszcze w pamięci i że gdyby nie to, to on już dawno jest gotowy do wykonania. Możemy zatem zaobserwować zjawisko, gdy procesor(y) będą nieobciążone, za to dyski będą skrzeczeć jak szalone i LA będzie wynosić 100, 200 a nawet więcej.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.innervision.pl/2009/11/13/load-average-o-co-chodzi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

