Memcached - efektivní SLABy
Vrátil jsem se zpět k testování 1GB cache. 2GB verzi už mám otestovanou a samozřejmě jsem změnil pár věcí, takže potřebuji stejně otestovat původní verzi 1GB. Mám v plánu i test 3 a 4GB cache. To bude znamenat navýšení RAM na serveru a po testu se uvidí, zda ji zase snížím nebo bude mít takový přínos, že obětuji navýšenou platbu za server.
Každopádně jsem hračička. Memcached se sice dá nakonfigurovat od jaké velikosti má tvořit SLAB a jakým násobkem. Default je 48 bytes a koefiecient 1,25. To znamená, že každý další SLAB bude mít o 1/4 větší hodnotu než předchozí. Jsem docela nadšen, že memcache nevytváří každý SLAB pokud ho nepotřebuje. Nemusí tedy vytvořit všechny tj např 90 - 120 - 152 - 190 bytes, ale klidně nějakou hodnotu vynechá, dokud nebude mít adekvátní požadavek.
Pro začátek jsem nastavil, že nejmenší chci 200 bytes (reálně by se vytvořil 120 - 150 - 192). Tam se vejdou skoro všechny hlavní proměnné, co potřebuji a kapacita jednoho slabu je 5.242 položek. Další potřebuji až kolem hodnoty 1,9kB, který má kapacitu 539 položek. Tam se mi vejde další fůra věcí resp jich mám zatím asi 100, ale plánuji, že jich bude víc.
Samozřejmě data mám různá a vytvořily se mi SLABY 200 - 632 - 792 - 992 - 1200 - 1500 - 1900 atd v červených SLABech mám pár hodnot = nevyplatí se mi. Na to abych uložil méně než 5 položek a zabral vždy 1MB cache je doslova blbost. Bohužel memcached neumí vytvořit SLABy na přání a ostatní vynechat, umí jen ty násobky. Což navýšit násobek se mi nevyplatí na konci poli, kde bych plýtval místem.
Takže data upravuji - nafukuji, aby zabraly více místa vešly se až do většího SLABu, kde se jich pak nashromáždí víc. Nejsnažší bylo přidat nakonec adekvátní počet mezer a po vybrání dat z cache je jednoduše oříznout trim(); Zdálo se mi to elegantní.
Mnohem lepší je uložit v položce další pole, které nebudu vůbec načítat a nemusím nic ořezávat. Navíc můžu přidat jiné znaky než mezery. Memcached totiž od určité velikosti dat zapíná komprese a pak se mezery doslova ztratí. Efekt nula.
Takže jednoduché řešení:
if(strlen($data)<1550){$data2=lorem_ipsum(1550-strlen($data));}//pridat na velikosti aby spadnul do SLAB 1900 bytes
a data2 uložím jako další pole do položky! Super. Sice komprese něco stlačí, ale s tím se už dá +/- počítat a navýšit limity. Lorem ipsum jsem si vygeneroval na internetu o délce 4kB. To mi stačí a až nebude stačit dám dvě lorem ipsum za sebe atd.
moje upravená verze PHPMemcached, červeně svítí SLABy, které bych po restartu už nechtěl. V tomto případě bych ušetřil 7MB cache,
což znamená místo pro cca 500 jiných položek, které naopak chci uložit
Takže teď si budu hrát a hledat, která data a o kolik dofouknout, aby se mi v další verzi cache už nevytvořily SLABy pro které mám jen malinké využití.
Ukázka dofouknutých dat:
a:3:{i:0;s:581:"data, která chci";i:1;s:5:"data2, která chci";i:2;s:969:"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas aliquet accumsan leo. Etiam quis quam. In laoreet, magna id viverra tincidunt, sem odio bibendum justo, vel imperdiet sapien wisi sed libero. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Integer tempor. Praesent id justo in neque elementum ultrices. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Praesent id justo in neque elementum ultrices. Fusce tellus odio, dapibus id fermentum quis, suscipit id erat. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Quisque tincidunt scelerisque libero. Mauris tincidunt sem sed arcu. Nullam eget nisl. Ut enim ad minim veniam, qu";} END