Edjet LMS Server 6.4

Výkon a škálování

Tato příručka vám pomůže učinit důležitá rozhodnutí o prostředcích, které je třeba použít k provozu Edjet LMS ve vašem prostředí.

Osnova článku:

Rozhodnutí o zdrojích

Před nastavením prostředí (serveru) a nasazením Edjet LMS Server do něj doporučujeme zkontrolovat základní systémové požadavky a také provést několik rozhodnutí o konfiguraci zdrojů (hardwaru) na základě očekávané pracovní zátěže.

Nejprve byste si měli položit několik základních otázek o charakteristikách provozu:

  • Kolik souběžných uživatelů chcete/potřebujete zvládnout?
  • Jaký bude charakter záteže? Špičky?
  • Jaké jsou vaše požadavky na rychlost/latenci aplikace?
  • Jaké jsou vaše požadavky na dostupnost aplikace?
  • Kolik dat celkem očekáváte, že uložíte? Videa? Fotografie v Hi-res?
  • Existují nějaké další specifické problémy? Veřejný e-learningový portál s veřejnými kurzy, například.

Na základě těchto údajů a několika jednoduchých výpočtů byste měli být schopni se rozhodnout:

  • Jaký procesor (CPU)
  • Kolik paměti (RAM)
  • Jaké úložiště
  • Jaká síť
  • Další možnosti

Procesor (CPU)

Rychlejší procesor je lepší pro latenci aplikace.

Více procesorů (jader) je lepší pro zpracování většího počtu souběžně pracujících uživatelů.

Vzhledem k tomu, že stack LAPP běžící na unixových strojích je velmi dobře škálovatelný pomocí vícevláknové architektury, největší vliv na výkon má více jader (vláken nebo vCPU v cloudu). To je nejdůležitější zejména pro prostředí s vysokou souběžností.

Chcete-li pochopit vliv počtu jader a zjistit, co je možné zvládnout s různými konfiguracemi, podívejte se na výkonostní report níže.

Paměť (RAM)

Je důležité mít dostatek paměti pro pracovní zátěž, abyste se vyhnuli swapování do pomalejšího úložiště.

Množství operační paměti má obvykle největší vliv na výkon, pokud jí není dostatek. Získejte jí co nejvíce. Na druhou stranu samozřejmě není hospodárné přeceňovat potřebnou paměť. Může to být velmi drahá chyba.

Pro výpočet operační paměti je třeba odhadnout počet požadovaných souběžných uživatelů, průměrnou velikost procesů (Apache a PostgreSQL) kombinovaných v jednom požadavku HTTP a množství operační paměti využívané operačním systémem a dalšími službami.

Souběžní uživatelé

Zatížení serveru v určitém okamžiku závisí na počtu současně pracujících uživatelů.

Ne na celkovém počtu uživatelských účtů a ne na počtu přihlášených uživatelů. Pod pojmem "souběžní uživatelé" se rozumí ti uživatelé, pro které server něco aktivně dělá - nejčastěji se jedná o odesílání požadavků HTTP kliknutím.

Vzhledem k tomu, že souběžná aktivita uživatelů je zcela náhodná, je obtížné ji měřit a vypočítat. Při výpočtu přesné souběžnosti je tedy možné striktně myslet pouze počet aktivních procesů webového serveru - souběžných procesů.

Souběžné procesy

Každé kliknutí uživatele generuje požadavek HTTP na server a vyžaduje podproces Apache, a pokud je v dané části aplikace zapojena databáze, také podproces PostgreSQL.

Každý z nich spotřebovává určitou paměť a vyžaduje připojení k webovému serveru a databázi.

Velikost procesů

Edjet LMS je poměrně komplexní aplikace. Jeden požadavek HTTP, například vykreslení stránky s obsahem kurzu, vyžaduje přibližně 40-75 MB paměti RAM. Statisticky je více procesů složitějších, proto počítáme s průměrnou velikostí 68 MB*. To zahrnuje proces Apache i PostgreSQL.

* To má pouze informativní charakter. Použité prostředí: Edjet LMS Server 3.6.1, Debian 6 s 24 GB paměti. U různých verzí a konfigurací může být velikost opatrná. Velikost procesů Windows Serveru může být zcela odlišná! Prosíme, abyste si tuto otázku prověřili sami ve své konkrétní situaci.

Spotřeba paměti operačního systému

Záleží na mnoha věcech. Nejlepším způsobem je nainstalovat konfiguraci podle vlastního výběru a zjistit, jaké jsou požadavky.

Další informace naleznete na:
Požadavky a nastavení prostředí pro Linux
Požadavky a nastavení prostředí pro systém Windows

Pro standardní linuxové distribuce vhodné pro webový server, pokud s tím nechcete trávit čas, použijte přibližně 1 GB na každých 8 GB instalované paměti.

Výpočet

Pro 150 souběžných procesů je to:
150 x 68 = 10,2 GB paměti RAM.

Takže vaše možnost bude pravděpodobně 16 GB RAM, takže přidejte další 2 GB pro operační systém:
10.2 + 2 = 12,2 GB

A máte také volnou paměť RAM pro další úlohy, jako je spouštění zálohování, např.

Vypočtené odhady* viz následující tabulka:

Požadované množství souběžných procesů Odhadované množství potřebné paměti RAM
100 8 GB
200 16 GB
450 32 GB
850 64 GB
1700 128 GB
3000 224 GB

* pro zjednodušení předpokládejme jeden fyzický server určený pouze pro LMS

Úložiště

Rychlejší úložiště je lepší, zejména pro databázi SQL (viz níže).

Rychlé SSD jsou nejlepší volbou. V cloudu můžete použít volume s vyššími rezervovanými IOPS.

Můžete také nastavit specifické diskové pole pomocí RAID nebo jiné konfigurace/technologie určené pro rychlost.

Pokud používáte síťový disk (NAS), ujistěte se, že je k serveru připojen dostatečně rychlou linkou s nízkou latencí.

Síť

Ujistěte se, že je váš server připojen ke stabilní a rychlé lince k internetu.

Měli byste hledat alespoň střední výkon, ale pro větší nasazení se doporučuje připojení se šířkou pásma sítě 1 Gb/s.

Další možnosti

Měli byste také zvážit prostředí s více servery nebo konkrétní cloudové řešení a možnosti, jako jsou spravované databáze, vyrovnávače zátěže nebo jiné.

Testování výkonu

Testování výkonu aplikace/serveru nelze správně provést bez správných nástrojů. Existuje mnoho nástrojů pro zátěžové nebo stresové testy, takže si vybereme alespoň tyto dva:

ab - ApacheBench

Apachebench je k dispozici již v základní instalaciApache.

ab je nástroj pro srovnávací testování serveru Apache Hypertext Transfer Protocol (HTTP). Je navržen tak, aby vám poskytl představu o tom, jak vaše současná instalace Apache funguje. To vám zejména ukáže, kolik požadavků za sekundu je vaše instalace Apache schopna obsloužit.

Ovládá se z příkazového řádku. Opensource.
http://httpd.apache.org/docs/2.2/programs/ab.html

JMeter

Desktopová aplikace Apache JMeter™ je software s otevřeným zdrojovým kódem, 100% čistá aplikace v jazyce Java určená k testování funkčního chování a měření výkonu. Původně byl navržen pro testování webových aplikací, ale od té doby se rozšířil i na další testovací funkce.

JMeter pěkně simuluje souběžné uživatele, umí exportovat logy do CSV,...

Opensource, napsaný v jazyce JAVA. Má uživatelské rozhraní, které umožňuje nastavit zátěžové testy pro neprogramátory.
https://jmeter.apache.org

Výkonostní report (ke stažení)

Stáhněte si papírový report o výkonu serveru Edjet LMS ve formátu PDF se všemi údaji a grafy.

Stáhnout

Optimalizace prostředí

Na straně serveru jsou možné optimalizace, které zrychlí systém LMS.

Předpokládá se, že bude vyladěn na základě analýzy reálné situace, aby se určila úzká místa, a změřen pomocí syntetických testů před uvedením do produkce.

Databáze SQL

Nejčastější jsou problémy s výkonem databáze.

Databáze SQL vs. rychlost úložiště

Databáze je jen tak rychlá, jako vaše úložiště. Rychlé úložiště může výrazně zvýšit výkon Edjet LMS Server.

Pokud vám vadí cena, můžete si nastavit 2 úložiště:

  • Rychlý - malé, ale velmi rychlé úložiště určené pro databázi SQL
  • Pomalé - velké, ale pomalejší úložiště pro "soubory"

Zvažte také možnost přesunout SQL do specializovaných cloudových služeb, jako je AWS RDS, které nabízejí pokročilé možnosti výkonu.

Konfigurace PostgreSQL

Konfigurace databáze může pomoci databázi lépe se přizpůsobit pracovnímu zatížení. Edjet LMS Server funguje dobře s výchozím nastavením, pokud nenastanou některé specifické situace.

Tyto optimalizace lze provést poměrně snadno, ale neočekávejte velký nárůst výkonu, pokud databáze nebyla původně špatně nakonfigurována.

Všechny změny doporučujeme provádět pomocí souboru PostgreSQL .conf. Po změnách restartujte PostgreSQL.

Všechna následující nastavení jsou provedena na PostgreSQL 8.4 v Debianu 6 s 24 GB RAM.

Možnost Doporučená hodnota
shared_buffers* Nastavení alokace 25 % volné paměti pro PostgreSQL - 5,5 GB.
effective_cache_size* Nastavení přidělení 50 % volné paměti pro PostgreSQL - 11 GB.
max_connections Nastavte alespoň na hodnotu Apache MaxClients.

* je třeba změnit kernel SHMMAX na hodnotu kombinovaného potřebného množství paměti, v tomto případě 50 % dostupné volné paměti s trochou volného místa - 12 GB.

Příklad: Jak změnit volbu SHMMAX v Debianu 6

  • přidejte do souboru /etc/sysctl.conf tento řádek:
    kernel.shmmax = <hodnota v bytech>
  • použít nové nastavení spuštěním:
    sysctl -p /etc/sysctl.conf

Vyladění parametrů Kernel podle potřeb webového serveru a postgresu (SHMMAX atd.).

Optimalizace dotazů SQL a používání indexů

Problémy s výkonem SQL lze často vyřešit optimalizací databázových dotazů, pohledů a funkcí. Pro zrychlení a snížení zátěže velkých tabulek a často přistupovaných dat lze také vytvořit indexy.

Obě techniky vyžadují úpravu a testování aplikace, ale jsou obvykle velmi účinné, pokud jsou provedeny správně.

K odhalení a odstranění problémů s výkonem SQL by měly být použity specializované nástroje pro profilování SQL.

Sdružování připojení

Pokud je úzkým místem počet připojení, můžete nastavit "pgpool" nebo jiný software pro sdružování připojení.

Pokročilé konfigurace SQL

Výkon můžete zvýšit pomocí různých pokročilých nastavení, jako jsou repliky pro čtení, přesun databází do cloudu, kde je k dispozici funkce automatického škálování (služby jako AWS RDS) atd.

Webový server

Webový server je zřídkakdy úzkým hrdlem výkonu, ale pokud se vyskytnou problémy, můžete se pokusit podniknout některé kroky i tímto směrem.

  • Ladění Apache - minimalizace paměťové stopy (nepoužívané moduly, vlastní kompilace)
  • Změna modulu MPM z preforku na worker (menší využití paměti, lepší pro více CPU)
  • Výběr jiného webového serveru, který je rychlejší a méně náročný na paměť než Apache (nginx, lightppd,...)
Konfigurace Apache

Všechny změny doporučujeme provádět pomocí souboru Apache .conf.
Po změnách restartujte webový server (stop+start nemusí stačit).

Všechna následující nastavení jsou provedena na Apache 2.2.16 v Debianu 6

Možnost Doporučená hodnota
MaxClients Nastaveno na počet vypočtených souběžných procesů
při překročení hodnoty 256 je třeba změnit také volbu ServerLimit (výchozí hodnota je 256), je třeba ji přidat (ve výchozím nastavení není uvedena).
KeepAliveTimeout Pokud se jedná o problém, nastavte toto číslo na nižší hodnoty (např. 5s) a poté na výchozí hodnotu (15s). Doporučujeme ji nastavit na základě reálných testů a reálného publika.

Povolení podpory komprese gzip

Zapnutí funkce zlib.output_compression na serveru může pomoci snížit velikost přenášených dat.

Na druhou stranu je potřeba výpočetní výkon pro zpracování komprese za běhu, což může způsobit vysoké zatížení procesoru, což může vést k nižšímu celkovému výkonu.

Kompresi lze nastavit pro různé typy mimetypů:

  • HTML
  • CSS
  • JS
  • další mimetypy, které lze uložit do mezipaměti

Edjet LMS caching

Celý subsystém cachování je implementován ze dvou důvodů - rychlosti a zatížení serveru (zatížení zpracováním i šířkou pásma). Při interakci mezi serverem a klientem existuje několik typů ukládání do mezipaměti:

Typ Úroveň nebo technika
Mezipaměť aplikace
  • Obrázky cache (třída ImageGenerator, fce getSrc & loadScr)
  • Lokalizační řetězce cache
  • Obrázky CSS - technika sprites
Vyrovnávací paměť prohlížeče Vypršení mezipaměti v prohlížeči (nastavené pomocí hlaviček HTTP).

Obrázky v mezipaměti

Tento typ mezipaměti je implementován všude tam, kde je obrázek zpracováván prostřednictvím třídy imageGenerator.

Třída ImageGenerator
Tato třída je umístěna v souboru <approot>\class\class_imagegenerator.php

Třída používá tyto metody:

  • loadSrc - slouží k načtení url obrázku uloženého v mezipaměti (řetězec)
  • getSrc - slouží k načtení url obrázku z mezipaměti (výstupní echo)

getSrc

Tato třída slouží k ukládání obrázků do mezipaměti. Pokud je na stránce použit obrázek z knihovny médií (kdekoli v systému, v administraci i na webu - v závislosti na použité šabloně), použije se následující postup:

  • získá se první hash původního obrazu
  • pak se získají požadované rozměry obrazu (vstup pro metodu, typicky definovaný v šabloně)
  • pak se získají další parametry (pokud existují), jako je "čtverec", "ořez", "vodoznak" atd.
  • v dalším kroku jsou tato data porovnána s existujícími soubory v adresáři image cache
  • pokud je soubor nalezen, pak je tato cesta k obrázku vrácena do metody
  • pokud soubor neodpovídá, pak je pomocí knihovny GD vytvořen příslušný obrázek v mezipaměti a cesta k němu je vrácena do metody

Adresář / cesta k mezipaměti obrázků
Obě hodnoty jsou definovány v souboru config.php.
Výchozí hodnota je: tmp\cache\images

Možnosti formátu názvu souboru v mezipaměti
Tento formát je definován v souboru cfg.ini.php v sekci System v proměnné image_cache_format.

Formát se může skládat z následujících částí:

  • info: požadované parametry (rozměry + další možnosti...)
  • hash: filehash (sha1) obrázku (používá se pro identifikaci obrázku a bezpečnostní otázky - ochrana souborů)
  • ext: přípona obrázku (jpg, gif, png)
  • filename: název obrázku (vrácená hodnota je s příponou)

Výchozí formát je info_hash.ext
Příklad názvu souboru obrázku v mezipaměti
150_150__4f3b0172bb9866239cbf9ba1a3d5c23543a01518.jpg

Příklad syntaxe použití imagegenerátoru v šablonách:
ImageGenerator::loadSrc(security::image_getFullPath($value['image_path'] . $value['image_filename']), 180, 220, true, true, true);

Další příklady najdete v souboru code_examples.tpl.php.

Lokalizační řetězce cache

Tento typ mezipaměti je implementován všude tam, kde je lokalizační řetězec zpracováván prostřednictvím třídy Lang.
Složka Cache je umístěna v úložišti systémových souborů: /tmp/cache/localization_strings/

Instalace a aktualizace