Autor Zpráva
mpm
Profil *
Zdravím,

existuje cesta jak nastavit MPM worker nebo apache obecně tak, aby jeden požadavek jednoho klienta mohl využít více jak jedno serverové jádro? Apache běží na OS Windows.
Jde o to, že stánky generují velice obsáhlé pdf soubory a po kliknutí na vytvoření pdf, server vykazuje zátěž jednoho jádra s tím, že klient, který zadal požadavek na vytvoření pdf se může na stránkách dále pohybovat až po vytvoření tohoto pdf.
Požadavky z dalších počítačů server normálně obsluhuje a využívá pro ně dalších jader.
Davex
Profil
mpm:
V Apache pravděpodobně problém nebude. Domnívám se, že to bude spíš způsobeno omezením prohlížeče, který navazuje maximálně 6 současných připojení se serverem, ale netuším, proč by se to zablokovalo jedním generováním PDF souboru. Jak je to vytváření PDF uděláno? Nepoužívá se tam zamykání souborů?



Asi se mi to podařilo nasimulovat na Windows XP. Projevuje se to pouze v kombinaci Apache pro Windows a PHP jako modulu. Při spuštění PHP skriptu se Apache „kousne“, nepřijímá další požadavky a čeká na skončení skriptu.

Problém zmizel, když se do httpd.conf přidala konfigurační volba:

Win32DisableAcceptEx
mpm
Profil *
Davex:
Přidání té konfigurační volby problém bohužel nevyřešilo - server během generování PDF od klienta nepřijímá požadavky. PDF vytváří doplňkový modul mpdf a ohledně zamykání souborů si nejsem jist ale flock() se ve skriptech nevyskytuje.
Moduly jsou v rámci balíčku Wamp server 2.2 (PHP 5.3.9, Apache 2.2.21) a OS je Windows server 2003. DB neběží na stejném serveru (s její výkonností problém určitě není).
Ještě je zde otázka toho využití více jader. Když pominu možná rizika, jako že mi jeden klient vytíží celý server, lze ty pdf generovat (nebo obecně zpracovávat požadavky jednoho klienta) na více/všech serverových jádrech?

Děkuji
Davex
Profil
Rozdělování vláken mezi procesorová jádra je starostí operačního systému, a pokud nemá proces nastavenou afinitu, tak je rozděluje rovnoměrně mezi nevytíženými jádry. Paralelní běh více vláken na jednom procesoru je také běžné, takže na místě by byla spíš otázka, zda dokáže PHP modul na Windows správně rozvětvovat požadavky do více vláken. Když spustíš jiný dlouho běžící skript, tak se to chová stejně nebo to nemá na další skripty vliv?

Zkoušel jsem to na starším XAMPPu s Apache 2.2.11 a PHP 5.3.6, kde záleželo pouze na konfigurační volbě výše, ale s tím rozdílem, že bez ní čekaly na dokončení skriptu úplně všechny požadavky i na jiné PHP skripty z různých prohlížečů a počítačů.



Zkusil jsem jednoduchý skript na víceprocesorovém systému s Windows Server 2008 R2 a vypadá to, že PHP modul vytěžuje opravdu jen jedno jádro, ale běžící skript neblokuje ostatní. Dodatečně jsem přišel na to, že se to zablokuje po zapnutí session_start().

Ve Windows mě napadá pouze jedno řešení, a to vypnutí mod_php5 a spouštění PHP pomocí modulu mod_fcgid (FastCGI).
mpm
Profil *
Tak jsem to nakonec ještě zkusil na Linuxu (Ubuntu 12.04 64-bit). Nejdřív jsem jen nainstalovat Apache a PHP ale to zlepšení moc nepřineslo. Klient čekal na vytvoření pdf, které běželo na jednom serverovém jádru a nemohl dělat nic jiného (v tomto řešení jsem neměřil čas vytvoření pdf). Potom jsem to vedl na MPM worker a šel od znova podle:
http://www.howtoforge.com/installing-apache2-with-php5-and-mysql-support-on-ubuntu-12.04-lts-lamp
a následně
http://ubuntuforums.org/showthread.php?t=1038416
Apache se trochu bránil ale nakonec stránky podle těchto postupů fungují. Pozitivní zpráva je, že malé (testovací) 20-ti stránkové pdf to nevytváří 25s jako na Windows ale 8s takže velké zlepšení. Kazí to stále to, že linuxový server pro jeho tvorbu využívá také jen jedno jádro a klientovi neodpovídá na další požadavky. Zkoušel jsem vložit ten Win32DisableAcceptEx do /etc/apache2/httpd.conf ale poté nenaběhne ani služba Apache.
O rozdělování vláken nejde, to funguje v pořádku (jak Windows tak Linux). Jeden dlouhý požavek z jednoho PC = jedno jádro na 100%, druhý požadavek z druhého PC = druhé jádro na 100%, atd. Proces(y) afinitu nemají, respektive mají ale na všechny jádra serveru. Více vláken na jednom procesoru (jádře) také není problém. Já bych právě chtěl, aby mi jeden požadavek rozvětvil na více jader.
Ještě jsem zkoušel dobu trvání jiného skriptu. Jelikož nic jiného dlouho trvajícího nemám tak jen nějaký cyklus s "jednoduchým" výpočtem. Konkrétně
for($h=1;$h<=99999999999;$h++)
      {
      $a=454612789*$h;
      
      }
Ten také běží jak pod Windows tak i pod Linuxem na jednom jádře.
Session_start() se při tvorbě pdf využívá tak to přepíšu (snad zítra) na jinou metodu, jestli to pomůže.
Pod Linuxem je cesta jak jeden požadavek jednoho klienta rozvětvit na více jader?

Děkuji
Davex
Profil
Domnívám se, že je problém způsoben v PHP zamykáním souboru se session, který by chtělo uzavřít co nejdřív, aby další požadavky od stejného klienta nemusely čekat. Tzn. ihned po zpracování $_SESSION zavolat session_write_close() a nemít je otevřené během generování PDF.

Pod Linuxem je cesta jak jeden požadavek jednoho klienta rozvětvit na více jader?
PHP není moc vícevláknové, spíš vůbec, takže skript nemůže běžet v rámci jednoho procesu na víc procesorech současně.
mpm
Profil *
Uzavření $_SESSION hned po zpracování pomohlo. Klient se nyní může během generování PDF na stránkách pohybovat.

Děkuji za pomoc

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: