ab je trochu otravné, pokud váš web potřebuje soubory cookie atd., ab je příliš jednoduchý.
V zásadě to z mých zkušeností s opravou několika implodujících PHP webů obvykle vypadá takto:
1) Lidé používají MySQL
Můžete zcela používat MySQL, facebook a flickr, udělejte to (fanoušci mysql je milují) POKUD ZNÁTE GOTCHAS, které jsou:
- Pokud máte tabulku MyISAM, která není jen pro čtení, a jakýkoli dotaz delší než 100 nás (i výběrů), jste mrtví
Na jednom webu, který jsem opravil, si ten chlap pronajal dvoujádrový server, protože „jeho web potřebuje energii“. Podívám se na jeho stránky, podívám se na své předchozí stránky s> 100 000 členy a torrent trackerem, který běžel na serveru Via C7 micro-half-pizzabox, a říkám mu, že vaše stránky fungují dobře na Celeron 300, který je v mém sklepě , a to je dokonce přehnané, můžu vám to pronajmout za polovinu ceny vašeho Xeonu, lol.
Ukázalo se, že ten chlap byl dobrý vývojář a opravdu milý chlap, ale nasával MySQL, takže jeho stránka měla typický vyhledávací dotaz z pekla, který dokáže zabít jakýkoli web:
- 10 vyhledávacích dotazů z pekla za sekundu (na svém nelegálním webu warez měl asi 300 tisíc členů)
- vyhledávací dotaz z pekla trvá přibližně 0,1–0,2 sekundy
- malý proud souběžných aktualizací stejné tabulky MyISAM, které vše okoření
=> celková serializace (zámky zápisu MyISAM) všech dotazů. 1 jádro 100 %, 7 jader nečinných, loadavg> 1000 (ano, používal Apache), stránkové časy> 30 sekund, funguje.
Oprava byla snadná:optimalizujte vyhledávací dotaz z pekla, opravte bod 2) níže, přepněte na InnoDB, přepněte na lighttpd. loadavg klesl na 0,02
2) AKTUALIZACE
Nikoho nezajímají počítadla stránek. AKTUALIZACE vydání 1 pro každé zobrazení stránky a jste mrtví. Přidejte nějaký MyISAM pro více efektů. Také zabiják na InnoDB, ne o zamykání, spíše o čekání na synchronizaci disku IO.
3) FULLTEXT
- MyISAM nelze použít pro čtení a zápis tabulek kvůli zamykání.
- MyISAM je spolehlivý jako ramdisk (ve skutečnosti méně:k poškození ramdisku potřebujete zhroucení operačního systému, poškození tabulek MyISAM potřebuje pouze zhroucení MySQL nebo prostě na něj narazíte příliš často, dostanete „unknown table engine chyba“, viděl jsem to mnohokrát)
- FULLTEXT není na InnoDB dostupný
- Jakékoli vložení do FULLTEXTOVÉHO indexu spustí téměř úplné znovu sestavení indexu (když jsem vložil příspěvek na fóru, bylo znovu vytvořeno 400 MB indexu)
==> Pokud potřebujete fulltextové indexování, výkon a spolehlivost, použijte Sphinx nebo Xapian.
Sphinx jsem nezkoušel (lidé o tom říkají dobré věci), ale Xapian šťastně prohledává 4 GB textu během okamžiku.
4) Lidé používají Apache.
To se pěkně kombinuje s výše uvedenými body.
Na rozdíl od správného serveru, jako je lighttpd, jehož využití CPU je nezjistitelné (nepříjemná Via C7 obsluhovala 100 HTTP hitů/s a lighttpd využíval méně než 1 % CPU), Apache váš box zabije.
Když MySQL začne odumírat (snadno umírá), klienti začnou tvrdě makat F5 a brzy budete mít asi 1000 procesů apache, z nichž každý drží PHP interpret a každý PHP interpret drží nečinné připojení MySQL a čeká na zámek MyISAM, kromě jednoho, který provádí nějakou triviální AKTUALIZACI vašeho počítadla zobrazení stránky, ale to nějakou dobu trvá, protože server přešel na obědovou výměnu kvůli 1000 apache a 1000 php a 1000 mysql procesům.
Lighttpd nepoužívá žádný procesor pro statické stránky. Jediný způsob, jak lighttpd nasytit váš CPU, je, když na něj tvrdě narazíte s apachebenchem rychlostí 20 000 požadavků/s. Pak Lighttpd mluví s několika, jako je 10 backendů php-fcgi (2-4 na jádro jsou dobré), které mluví s několika připojeními MySQL. Vše je díky tomu mnohem rychlejší a při přetížení degraduje ladně, nikoli explozivně.
Abyste se dostali k původní otázce, určitě chcete profilovat své SQL dotazy. Přidejte do své aplikace PHP protokol dotazů, který zobrazuje (pouze vám), seznam dotazů a čas, který zaberou, a také čas od začátku skriptu PHP do jeho konce (včetně záhlaví/zápatí je dobré místo pro toto).
U složité stránky (kromě vyhledávání) byste očekávali asi 3 ms MySQL a 3 ms PHP, to je dobrý cíl. Samozřejmě potřebujete mezipaměť kompilovaného kódu PHP.
Pro aktuální zatížení můžete udělat několik věcí. Nejdražší, ale nejpodrobnější odpovědi budou poskytovány prostřednictvím podnikové aplikace, jako je „Gomez“.
Pokud to však chcete udělat sami, podívejte se na mé předchozí odpovědi níže nebo použijte nástroje shellu, jako jsou:htop, top, w a využijte Apache server-status
Předchozí odpovědi před revizí otázky:
To, co požadujete, se někdy nazývá profilování aplikací.
Musíte vytvořit hrubý vzorec paměti jako:
httpd ram + využití paměti php + využití procesu mysql =celková paměťová náročnost požadavku
Budete také potřebovat vzorec CPU, ale můžete také použít oční bulvu během zátěžového testu.
Apache má příkaz 'ab'.
"ab je nástroj pro srovnávání vašeho serveru Apache Hypertext Transfer Protocol (HTTP). Je navržen tak, aby vám poskytl představu o výkonu vaší aktuální instalace Apache. Zejména ukazuje, kolik požadavků za sekundu je vaše instalace Apache schopna obsloužit. " http://httpd.apache.org/docs/2.0/programs/ab.html
Zde je obecný příkazový řádek benchmarku 'ab':
ab -n 10 -c 1 http://www.yoursite.com/
# qty 10 total requests, 1 request at a time
Strategií je otestovat zatížení vaší aplikace na proces (uživatele) od požadavku webové stránky až po dokončení. Pokud dokážete určit, kolik paměti Apache, PHP a MySQL používá pro každý požadavek, můžete rychle identifikovat kapacitu svého systému.
Pravděpodobně budete muset použít kombinaci diagnostických nástrojů, jako je vmstat nebo top nebo iostat nebo ps atd., abyste získali snímek toho, co bude od vašeho systému vyžadovat řada požadavků.
Nakonec budete chtít nainstalovat Xdebug. Tento nástroj vám pomůže profilovat php stránku aplikace.http://xdebug.org/
Zde je návod IBM na instalaci Xdebug:
http://www.ibm.com/developerworks/opensource/library/os-php-fastapps2/