Kontakt z pomocą

Odpowiadamy e-mailem, zwykle w ciągu dwóch dni.

Google reCAPTCHA sprawdza to zgłoszenie pod kątem nadużyć; dane trafiają do Google. Skrypt ładuje się dopiero po otwarciu formularza.

← Wszystkie wpisy

Pamięć podręczna mieszkająca w RAM-ie

Blisko jedna piąta obrazków licznika, które ten serwis rysuje, niczego już nie zmienia. Skrypt śledzący mysz z poprzedniej odsłony przeładowuje obrazek przy każdym ruchu, a odkąd te żądania przestały cokolwiek zwiększać, dwa z nich pod rząd dają ten sam obrazek, bajt w bajt.

Oczywisty kandydat na pamięć podręczną. Ciekawe były decyzje, gdzie ją umieścić i na co ma brzmieć klucz.

Nie na dysku

To chodzi na Raspberry Pi, a dyskiem jest karta SD. Zapisywanie tam narysowanych obrazków oznaczałoby jakieś 70 MB zapisu dziennie w zamian za zmierzoną oszczędność 1,6 minuty czasu procesora dziennie.

To zła zamiana. Karty SD umierają od zapisu, a kupowany jest błąd zaokrąglenia na maszynie, która procesorem nie stoi. Pamięć podręczna leży więc w /dev/shm, czyli w tmpfs, czyli w RAM-ie. Zmierzone tam: 0,027 ms na odczyt, 0,036 ms na zapis, 1,9 GB wolne.

Po restarcie wszystko znika. Dla pamięci podręcznej to nie strata, tylko stan normalny.

Na tym samym Pi chodzi Redis. Nie został użyty, z powodu, który nie ma nic wspólnego z techniką: należy do innej aplikacji i jest dla niej zabezpieczony hasłem. Wspólna instancja związałaby dwie niepowiązane usługi tak, że zły dzień jednej staje się złym dniem drugiej.

Klucz zawiera liczby

Zwykły klucz to tożsamość plus data ważności, a data ważności to zakład: przez ostatnie pięć minut nic ważnego się nie zmieniło. W liczniku to, co się zmienia, jest dokładnie tym, co widać.

Wyświetlane wartości trafiają więc do klucza. Zmieni się liczba, to jest inny klucz i obrazek rysuje się na nowo. Zakład znika, zamiast być zawierany ostrożnie. Każda policzona wizyta zwiększa co najmniej sumę od początku, więc żadna policzona wizyta nie dostanie przestarzałego obrazka. Pozostała data ważności jest już tylko górnym ograniczeniem dla wartości, których w kluczu nie ma — tygodniowych, miesięcznych i rocznych.

Co trzeba było najpierw sprawdzić

Pamięć podręczna jest bezpieczna tylko wtedy, gdy to, co przechowuje, jest funkcją swojego klucza. To twierdzenie o każdym wzorze z osobna, i zostało sprawdzone, a nie założone:

  • żaden wzór nie używa rand(), mt_rand(), shuffle() ani uniqid()
  • żaden wzór nie czyta zegara dokładniej niż co godzinę
  • parametry śledzące starego skryptu nie są czytane nigdzie w drzewie

Ten ostatni punkt dał najpiękniejszą porażkę całego ćwiczenia. Dopóki te parametry należały jeszcze do klucza, każde żądanie niosło nieco inne współrzędne myszy, więc każdy klucz był jednorazowy. Pamięć podręczna chodziła cały dzień i zanotowała 13 trafień. Działała bez zarzutu i nie robiła nic, a to najtrudniejszy do zauważenia rodzaj zepsucia.

A jeśli tu cokolwiek zawiedzie — nieczytelny katalog, pełny dysk, uszkodzony wpis — obrazek rysuje się normalnie. Pamięć podręczna nigdy nie może być powodem, dla którego licznik się nie pojawia.

Reklama