Valery's Mlog

Mindlog of a Freak
May 6th, 2005 by Valery Dachev

Apache 1.3 и PHP настройка

Странно. Преди вчера да оборудвам Mantra с 2Gb RAM (V-Data, нищо особено), натоварването на ма??ината редовно се покачва??е (като за секунди достига??е 140, преди да се задейства скрипта, който да рестартира Apache). Отдавах това на факта, че ма??ината остава??е със 6 Мб свободна оперативна памет и останалото бе??е swap. Най-вероятно заради постоянното swap-ване, процеосорът допълнително се товаре??е и от там всичко зависва??е. А дисковете са обикновени IDE и съответно не са от най-бързите. Причините да яде толкова памет, естествено, идват от web-чата. ??нтересното бе??е, че това продължи да се случва, дори след като сложих новата памет и то без да се стига до момента със swap-ването. По-важен се оказва въпроса “Защо аджеба Apache гълта толкова много памет ?”. Е, още не съм си отговорил на този въпрос. Явно е, че висящите процеси са много, но пък да заграждат толкова много ресурси, голяма част от които би трябвало уж да споделят… Може да се каже, че горе-долу овладях положението.

??грачка с настройките на самия Apache: Тъй като рестартирането на Apache определено освобождава паметта, тръгнах да действам срещу препоръките в httpd.conf (както всъщност съветва тази публикация), особено що се отнася до някои опции като:

  • Timeout – намаляването на стойността за тази опция (от 120 на 60 секунди) води до по-бързото разкарване на неактивни клиенти. Няма защо да висят изли??но на ма??ината.
  • KeepAlive – включването на тази връзка разре??ава подаването на две или повече заявки в рамките на една връзка към web сървъра. Това значително намалява допълнителното натоварване от отваряне и затваряне на връзка
  • KeepAliveTimeout – това е максималното време между две последователни заявки за една връзка до сървъра. Мисля, че три секунди са достатъчно много на всеки, за да подаде следващата си заявка, и в същото време достатъчно малко, за да не стои прекалено дълго отворена връзката.
  • MaxKeepAliveRequests – указва максималния брой заявки в рамките на една връзка. Добре е тази стойност да е достатъчно голяма (при мен – 100), за да поощря ослужливите браузъри, които подават заявките си една след друга.
  • MinSpareServers и MaxSpareServers – стойностите на тези директиви съответно минималния и максималния брой на сървърите причакващите заявки. Ако се случва да има моменти, в които броят на заявките в секунда имат големи пикове, MinSpareServers трябва да има достатъчно голяма стойност. MaxSpareServers пък трябва да е достатъчно малко число, за да не се похабяват изли??но ресурси, когато заявките не са чак толкова много. Доколкото при мен не се случват рядко такива “нападения”, двете променливи имат стойности съответно 32 и 64.
  • MaxRequestsPerChild – контролира броя на обработените заявки (даже по-скоро връзки, тъй като поредните KeepAlive заявки се отчитат като една), след които може да обработи дъщерния процес преди да се спомине. Това ре??ава евентуални проблеми с неосвободената от процеса памет (memory leak), тъй като тя се освобождава при загиване на процеса. А аз имам съмнения, че такива протичания на паметта съществуват, така че стойността е (на фона на препоръчваната 10000) стра??но малка – 20.

Оптимизация на PHP: На посочения по-горе адрес има връзки към няколко оптимизационни и/или ке??иращи раз??ирения към PHP. До днес я карах на безплатния, но затворен, Zend Optimizer, но тези резултати ме убедиха, ако не друго, да пробвам eAccelerator. ??нсталацията става доволно лесно и, дори с настройките по подразбиране, работи чудесно. Намаляха, както натоварването (не минава 2.0), така и използваната памет (с около 50Мб). С eAccelerator върви и PHP скрипт, с който може да се наблюдава използваната от оптимизатора памет, както и скриптовете, които са компилирани и ке??ирани, което може да е от помощ при настройване на заделената за оптимизатора споделена (shared) памет чрез опцията “eaccelerator.shm_size”. Малко настрани от темата, струва си да се спомене, че eAccelerator може да се използва за криптиране на изходния PHP код. Тъй като обаче eAccelerator е несъвместим със Zend Optimizer, предлага се и само раз??ирението “eLoader”, с което да се изпълява код криптиран с eAccelerator без на ма??ината да има инсталиран такъв и без конфликти с други раз??ирения.

?? така… както казва един преподавател във факултета ми: “??маме потресающ profit.”.

P.S. Ще??е ми се някак да се възмутя и от “developer newbies” що се отнася до PHP и до SQL. Забелязвам напоследък в mysql-slow.log някакви невероятни ре??ения на разработчиците на някои от хостваните при мен сайтове. Как може да не се замисли??, че (особено при големи таблици) заявка от типа на:

SELECT `table`.`id` FROM `table1`,`table2` WHERE (
      `table1`.`strfield1` LIKE '%search string%' OR
      `table1`.`strfield2` LIKE '%search string%' OR
      `table2`.`strfield` LIKE '%search string%'
   ) AND
   `table1`.`intfield1` < 1 AND
   `table1`.`intfield2` = 2

ще се обработва по-бавно отколкото ще я напи??е?? на лист. Абсолютна липса на каквато и да било оптимизация. Все си мисля, че:

SELECT `table`.`id` FROM `table1`,`table2` WHERE
   `table1`.`intfield2` = 2 AND
   `table1`.`intfield1` < 1 AND (
      LOCATE( 'search string', `table1`.`strfield1` ) OR
      LOCATE( 'search string', `table1`.`strfield2` ) OR
      LOCATE( 'search string', `table2`.`strfield` )
   )

ще работи много по-бързо… особено ако някой си направи труда да сложи и индекси по полетата. А със сигурност има и по-бърз вариант. Да не говоря и за греховната практика да се слага всяка една функция в отделен файл !.. ?? на тия хора пари им дават… Мога да си направя собствено The Daily WTF.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: