Mallin seurantaprosessi. Kuinka rajoittaa php-cgi-prosessien määrää mod_fcgidille

Ei ole mikään salaisuus, että melkein mikä tahansa kehitys automatisoitu järjestelmä alkaa syöte- ja lähtötietojen muodon määrittelemisellä. Tiedot voivat poiketa merkittävästi rakenteeltaan ja organisaatioltaan. Joillakin voi olla useita yhteyksiä, toiset voivat olla vain joukko yksinkertaisia ​​tyyppejä tiedot.

Olemme ensisijaisesti kiinnostuneita kahdesta lähestymistavasta tietojen tallentamiseen ja käsittelyyn: SQL ja NoSQL.

SQL(Strukturoitu kyselykieli) - kieli jäsennellyt kyselyt, jota käytetään tietojen luomiseen, muokkaamiseen ja hallintaan relaatiotietokannassa perustuen relaatiotietomalliin. Mielestäni samannimiseen lähestymistapaan ei kannata kiinnittää huomiota, koska tämä on ensimmäinen asia, jonka kukaan kohtaa tutkiessaan tietokantoja.

NoSQL(ei vain SQL, ei vain SQL) - useita lähestymistapoja, joiden tarkoituksena on toteuttaa tietokantamalleja, joilla on merkittäviä eroja työkaluista SQL-kieli perinteisille relaatiotietokantoille ominaista.

Termi NoSQL sen loi Eric Evans, kun Last.fm:n Joan Oscarson halusi järjestää tapahtuman keskustellakseen avoimen lähdekoodin hajautetuista tietokannoista.

NoSQL-konsepti ei ole SQL-kielen ja relaatiomallin täydellinen kieltäminen. NoSQL on tärkeä ja hyödyllinen työkalu, mutta se ei ole yleinen työkalu. Yksi klassisten relaatiotietokantojen ongelmista on vaikeus työskennellä erittäin suurten tietomäärien kanssa ja erittäin kuormitetuissa järjestelmissä. NoSQL:n päätavoite on laajentaa tietokannan ominaisuuksia siellä, missä SQL ei ole tarpeeksi joustava eikä tarjoa riittävää suorituskykyä, eikä syrjäyttää sitä siellä, missä se täyttää tietyn tehtävän vaatimukset.

Heinäkuussa 2011 Couchbase, CouchDB:n, Memcachedin ja Membasen kehittäjä, ilmoitti luovansa uuden SQL:n kaltaisen kyselykielen - UnQL (Unstructured Data Query Language). Työn uuden kielen luomiseksi suorittivat SQLiten luoja Richard Hipp ja CouchDB-projektin perustaja Damien Katz. Kehitys on siirretty yhteisön käyttöön julkisena

NoSQL-lähestymistavan käyttäminen on hyödyllistä tallentaa valtavia määriä yksinkertaista jäsentämätöntä tietoa, joka ei vaadi yhteyttä muihin tietoihin. Esimerkki tällaisista tiedoista on useiden miljoonien dollarien luettelo välimuisti- tai kuvatiedostoista. Samalla saamme huomattavan suorituskyvyn lisäyksen verrattuna relaatiolähestymistapaan.

NoSQL-järjestelmät

NoSQL DBMS

Määritellään käsitteet.

Skaalautuvuus – tietojen automaattinen jakelu useille palvelimille. Kutsumme tällaisia ​​järjestelmiä hajautetuiksi tietokannoiksi. Näitä ovat Cassandra, HBase, Riak, Scalaris ja Voldemort. Jos sinulla on paljon dataa, jota ei voida käsitellä yhdellä koneella tai jos et halua hallita jakelua manuaalisesti, tarvitset tämän.

Asiat, joihin on kiinnitettävä huomiota, ovat: tuki useille datakeskuksille ja mahdollisuus lisätä uusia koneita käynnissä olevaan klusteriin läpinäkyvästi sovelluksillesi.

Koneen lisääminen klusteriin läpinäkyvästi

Tuki useille datakeskuksille

Vaatii viimeistelyä tiedostolla

Kohdistamattomia tietokantoja ovat: CouchDB, MongoDB, Neo4j, Redis ja Tokio Kaappi. Näitä järjestelmiä voidaan käyttää hajautettujen järjestelmien "kerroksena".

Tieto- ja kyselymalli

NoSQL-tietokannassa on valtava määrä tietomalleja ja kyselysovellusliittymiä.

Tietomalli

Pyydä API

Pylväsperhe

Dokumentointi

Pylväsperhe

Dokumentointi

Kokoelmat

Dokumentointi

Sisäkkäiset tiivisteet, REST

Avain/arvo

Avain/arvo

Avain/arvo

Kolonniperhejärjestelmää käytetään Cassandrassa ja HBasessa. Molemmissa järjestelmissä on rivejä ja sarakkeita, mutta rivien määrä ei ole suuri: jokaisella rivillä on muuttuva numero sarakkeita ja sarakkeita ei tarvitse määrittää ennalta.

Avain/arvojärjestelmä on yksinkertainen eikä vaikea toteuttaa, mutta se ei ole tehokas, jos olet kiinnostunut vain tiedustelemaan tai päivittämään osaa tiedoista. Myös vaikea toteuttaa monimutkaiset rakenteet tämän tyyppisten hajautettujen järjestelmien päälle.

Asiakirjapohjaiset tietokannat ovat pohjimmiltaan seuraava taso avain/arvojärjestelmät, joiden avulla voit liittää upotettuja tietoja avaimeen. Tällaisten kyselyiden tukeminen on tehokkaampaa kuin pelkkä koko arvon palauttaminen.

Neo4J:ssä on ainutlaatuinen tietomalli, joka kuvaa objektit graafin solmuina ja reunoina. Tätä mallia noudattavien kyselyiden (esimerkiksi hierarkkisten tietojen) suorituskyky voi olla useita suuruusluokkia parempia kuin vaihtoehdot.

Scalaris on ainutlaatuinen siinä, että se käyttää hajautettuja tapahtumia useille avaimille.

Varastointijärjestelmä

Tämä on näkymä, jossa tiedot esitetään järjestelmässä.

Tietotyyppi

Muistettava / SSTable

Liitä vain B-puu

Memtable / SSTable HDFS:ssä

Levyllä linkitetty luettelo

Muistissa taustakuvilla

Kytkettävä (ensisijaisesti BDB MySQL)

Tallennusjärjestelmä voi auttaa arvioimaan työkuormia.

Järjestelmät, jotka tallentavat tietoja muistiin, ovat erittäin nopeita, mutta eivät pysty käsittelemään käytettävissä olevaa kokoa suurempia tietoja. RAM-muisti. Tällaisten tietojen säilyttäminen sähkökatkon tai katoamisen aikana voi olla haaste. Tietojen määrä, joka voi odottaa kirjoittamista, voi olla erittäin suuri. Jotkut järjestelmät, kuten Scalaris, ratkaisevat tämän ongelman replikoinnin avulla, mutta Scalaris ei tue skaalausta useiden tietokeskusten välillä.

Memtables / SSTables puskuroi kirjoituspyynnöt muistiin (Memtable) ja lisää ne lokiin kirjoittamisen jälkeen. Kun merkintöjä on kertynyt tarpeeksi, muistitaulukko lajitellaan ja kirjoitetaan levylle SST-taulukkona. Näin voit saavuttaa suorituskyvyn, joka on lähellä RAM-muistia, ja samalla päästä eroon ongelmista, jotka ovat merkityksellisiä tallennettaessa vain muistiin.

B-puita on käytetty tietokantoissa hyvin pitkään. Ne tarjoavat vahvan indeksointituen, mutta suorituskyky on erittäin huono, kun niitä käytetään koneissa, joissa on magneettinen kiintolevy.
Mielenkiintoinen ominaisuus on B-puiden käyttö CouchDB:ssä, jossa on vain B-Trees -toiminto, joka mahdollistaa hyvän suorituskyvyn kirjoitettaessa tietoja levylle. Tämä saavutetaan sillä, että binaaripuuta ei tarvitse rakentaa uudelleen elementtiä lisättäessä.

Hanke ansaitsee erityishuomiota Välimuistissa, josta tuli monien muiden järjestelmien edeltäjä.

Välimuistissa- ohjelmisto tietojen välimuistiin tallentamiseen palvelimen RAM-muistiin hash-taulukon paradigman perusteella. Tämä on korkean suorituskyvyn hajautettu muistissa oleva objektin välimuistijärjestelmä, joka on suunniteltu paljon kuormitettuja Internet-järjestelmiä varten.

Hajautustaulukko on tietorakenne, joka toteuttaa rajapinnan assosiatiivinen matriisi, jonka avulla voit tallentaa pareja (avain, arvo) ja suorittaa kolme toimintoa: append-toiminto uusi pariskunta, hakutoiminto ja parin poistotoiminto avaimella.

Asiakaskirjaston käyttö Välimuistissa avulla voit tallentaa tietoja RAM-muistiin useista eri kohteista käytettävissä olevia palvelimia. Jakelu toteutetaan jakamalla tiedot avaimen hash-arvon mukaan, samalla tavalla kuin hash-taulukon pistokkeet. Asiakaskirjasto laskee tietoavaimen avulla hajautusarvon ja valitsee sen avulla sopivan palvelimen. Palvelinvikatilanne tulkitaan välimuistin puutteeksi, mikä mahdollistaa kompleksin vikasietoisuuden lisäämisen lisäämällä välimuistissa olevien palvelimien määrää ja kykyä vaihtaa niitä.

Memcachedissa on monia muutoksia, jotka on kehitetty useissa projekteissa: Mycached, membase, Memcache, MemcacheQ, Memcacheddb Ja libMemcached .

Keskeinen projekti, NoSQL-konseptin veturi, on Memcached. Yksi Memcachedin merkittävimmistä haitoista on, että välimuisti itsessään on erittäin epäluotettava paikka tietojen tallentamiseen. Tämä puute on tarkoitus poistaa lisäratkaisuja: Memcacheddb ja membase. Käyttöliittymätasolla nämä tuotteet ovat täysin yhteensopivia Memcachedin kanssa. Mutta täällä, kun tiedot vanhentuvat, ne huuhdellaan levylle ("db-tarkistuspiste" -strategia). Tässä muodossa ne edustavat silmiinpistävää esimerkkiä "ei-relaatiotietokannoista" - pysyvistä (pitkäaikaisista) järjestelmistä hajautettuun tietojen tallentamiseen avainarvo-parien muodossa.

Seuraava Memcachediin perustuva tuote on MemcacheQ. Se on viestijonojärjestelmä, joka käyttää hyvin yksinkertaistettua sovellusliittymää Memcachedista. MemcacheQ muodostaa nimetyn pinon, johon voit kirjoittaa viestisi, ja itse tiedot tallennetaan fyysisesti BerkeleyDB-tietokantaan (samanlainen kuin Memcacheddb), joten turvallisuus, replikointi jne. on taattu.

LibMemcached on tunnettu C++-kielellä kirjoitettu asiakaskirjasto, joka on tarkoitettu työskentelemään jo tavallisen Memcached-protokollan kanssa.

Kaikki ei-relaatioliikkeet, tehty muodossa hajautettu järjestelmä ja avainarvoparien tallentaminen voidaan jakaa kahteen tyyppiin: vakaa ja epävakaa. Kestävä(Esimerkiksi, MemcachedB, membase, Hypertable) - kirjoittaa tiedot levylle varmistaen sen turvallisuuden vian sattuessa. Epävakaa(klassinen Memcached) - ne tallentavat avaimet haihtuvaan muistiin eivätkä takaa niiden turvallisuutta. On perusteltua käyttää epävakaita tallennusvälineitä välimuistiin ja vähentää vakaiden tallennusten kuormitusta - tämä on niiden erottamaton yhteys ja tärkein etu.

Kimmoisat varastot ovat täysimittaisia ​​NoSQL-tietokantoja, jotka yhdistävät Memcachedin nopeuden ja mahdollistavat monimutkaisempien tietojen tallentamisen.

Käyttöliittymä + taustajärjestelmä

Yleisin järjestelmä, jossa etuosa on nopea ja kevyt verkkopalvelin(esimerkiksi Nginx), ja Apache toimii taustaohjelmana.

Katsotaanpa tällaisen järjestelmän etuja esimerkin avulla. Kuvitellaanpa se verkko Apache-palvelin On tarpeen palvella noin 1000 pyyntöä samanaikaisesti, ja monet näistä asiakkaista ovat yhteydessä Internetiin hitaita viestintäkanavia pitkin. Apachen tapauksessa päädymme 1000 httpd-prosessiin, joista jokaiselle on varattu RAM-muistia, ja tämä muisti on varattu, kunnes asiakas vastaanottaa pyydetyn sisällön tai tapahtuu virhe.

Käytettäessä frontend+backend-mallia, asiakaspyynnön saapumisen jälkeen Nginx välittää pyynnön Apachelle ja saa nopeasti vastauksen. Ja staattisen sisällön (html, kuvat, välimuistitiedostot jne.) tapauksessa Nginx luo vastauksen itse häiritsemättä Apachea. Jos meidän on vielä suoritettava logiikka (php-skripti), Apache, kun se on tehnyt tämän ja palauttanut vastauksen Nginxille, vapauttaa muistin, niin Nginx-verkkopalvelin on vuorovaikutuksessa asiakkaan kanssa, joka on juuri tarkoitettu staattisen sisällön jakamiseen suuri määrä asiakkaita, kun järjestelmäresursseja kuluu vähän. Yhdessä asiantuntevan välimuistin kanssa säästämme valtavia palvelinresursseja ja järjestelmän, jota voidaan oikeutetusti kutsua erittäin kuormitetuksi.

Työhevoset

Apache - suorituskyvyn optimointi

Frontend+backend-järjestelmässä Apachen suorituskyky ei ole niin kriittinen, mutta jos arvostat jokaista prosessorin ajan mikrosekuntia ja jokaista RAM-tavua, sinun tulee kiinnittää huomiota tähän ongelmaan.

Viilein tapa on lisätä palvelimen suorituskykyä - asenna nopeampi prosessori(t) ja lisää muistia, mutta sinä ja minä valitsemme aluksi vähemmän radikaalin polun. Nopeutetaan sitä Apache-työtä optimoimalla sen kokoonpanon. Joitakin määrityksiä voidaan käyttää vain Apachea rakennettaessa, kun taas toisia voidaan käyttää ilman palvelimen uudelleenkääntämistä.

Lataa vain tarpeelliset moduulit

Suurin osa Apachen toiminnoista on toteutettu moduuleilla. Lisäksi nämä moduulit voidaan joko "ommella" tiettyyn kokoonpanoon tai ladata muotoon dynaamiset kirjastot(DSO). Useimmat nykyaikaiset jakelut toimittavat Apachelle joukon jakeluverkkoyhtiöitä, joten älä tee sitä tarvittavat moduulit voidaan poistaa käytöstä ilman uudelleenkääntämistä.

Vähentämällä moduulien määrää vähennät kulutetun muistin määrää. Jos päätät kääntää Apachen itse, ole joko valikoiva sisällyttävien moduulien luettelon suhteen tai käännä ne DSO:iksi käyttämällä Apache1:ssä apxs:ia ja Apache2:ssa apxs2:ta. Voit poistaa tarpeettomat DSO-moduulit käytöstä kommentoimalla ylimääräiset LoadModule-rivit httpd.confissa. Jos käännät moduuleja staattisesti, Apache kuluttaa hieman vähemmän muistia, mutta sinun on käännettävä se uudelleen joka kerta poistaaksesi tai ottaaksesi tietyn moduulin käyttöön.

Valitse oikea MPM

Pyynnön käsittelemiseksi Apache varaa oman prosessinsa tai säietensä. Nämä prosessit toimivat jonkin MPM:n (Multiprocessor Model) mukaisesti. MPM:n valinta riippuu monista tekijöistä, kuten siitä, onko käyttöjärjestelmässä säietuki, vapaan muistin määrä sekä vakaus- ja suojausvaatimukset.

Jos tietoturva tulee suorituskyvyn edelle, valitse peruser tai Apache-itk. Jos suorituskyky on tärkeämpää, harkitse esihaarukkaa tai työntekijää.

Nimi

Kehittäjä

Tuettu käyttöjärjestelmä

Kuvaus

Tarkoitus

Apache Software Foundation

Hybridi moniprosessori-monisäikeinen malli. Säilyttäen moniprosessoriratkaisujen vakauden, se mahdollistaa palvelun iso luku asiakkaiden kanssa minimaalista käyttöä resursseja.

Kohtalaisen ladatut web-palvelimet.

Vakaa.

Apache Software Foundation

Erillisten prosessien alustavaan luomiseen perustuva MPM ei käytä säikemekanismia.

Parempi tietoturva ja vakaus prosessien eristämisen ansiosta, mikä säilyttää yhteensopivuuden vanhempien kirjastojen kanssa, jotka eivät tue säikeitä.

Vakaa.

Apache Software Foundation

Hybridimalli, jossa on kiinteä määrä prosesseja.

Erittäin kuormitetut palvelimet, mahdollisuus ajaa lapsiprosesseja käyttämällä eri käyttäjätunnusta turvallisuuden parantamiseksi.

Kehityksessä epävakaa.

Apache Software Foundation

Monisäikeinen malli, joka on optimoitu käytettäväksi NetWare-ympäristössä.

Novell NetWare -palvelimet

Vakaa.

Apache Software Foundation

Microsoft Windows

Monisäikeinen malli suunniteltu käyttöjärjestelmä Microsoft Windows.

Palvelimet alla Windowsin ohjaus Palvelin.

Vakaa.

Steinar H. Gunderson

MPM perustuu prefork-malliin. Antaa kaikkien juosta virtuaalinen isäntä erillisen uid:n ja gidin alla.

Isännöintipalvelimet, käyttäjien eristämisen ja resurssien kirjanpidon kannalta kriittiset palvelimet.

Vakaa.

Sean Gabriel Heacock

Malli luotu MPM perchidin perusteella. Mahdollistaa jokaisen virtuaalisen isännän käynnistämisen erillisellä uid- ja gid-tunnuksella. Ei käytä lankoja.

Turvallisuus lisääntynyt turvallisuus, työskentelee kirjastojen kanssa, jotka eivät tue säikeitä.

MPM:n muuttaminen vaatii Apachen uudelleenkääntämisen. Tätä varten on kätevämpää ottaa lähdepohjainen jakelu.

DNS-haku

HostnameLookups-direktiivi sisältää käänteiset DNS-kyselyt, joissa asiakkaiden DNS-isännät kirjoitetaan lokeihin IP-osoitteiden sijaan. Tämä hidastaa huomattavasti pyynnön käsittelyä, koska pyyntöä ei käsitellä ennen kuin DNS-palvelimelta on saatu vastaus. Varmista, että tämä ohje on aina pois päältä (HostnameLookups Off). Jos DNS-osoitteita tarvitaan, voit "suorittaa" lokin logresolve-apuohjelmassa.

Varmista myös, että Allow from- ja Deny From -käskyt käyttävät IP-osoitteita domain-nimet. Muuten Apache tekee kaksi pyydä dns(taakse ja eteenpäin) selvittääksesi ip:n ja varmistaaksesi, että asiakas on kelvollinen.

SalliOverride

Jos AllowOverride-direktiivin arvoksi ei ole asetettu Ei mitään, Apache yrittää avata .htaccess-tiedostoja jokaisessa hakemistossa, jossa se vierailee, ja kaikissa sen yläpuolella olevissa hakemistoissa. Esimerkiksi:

DocumentRoot /var/www/html

SalliOverride all

Jos /index.html pyydetään, Apache yrittää avata (ja tulkita) /.htaccess-, /var/.htaccess-, /var/www/.htaccess- ja /var/www/html/.htaccess-tiedostot. Ilmeisesti tämä pidentää pyynnön käsittelyaikaa. Joten jos tarvitset .htaccessin vain yhdelle hakemistolle, salli se vain tälle hakemistolle:

DocumentRoot /var/www/html

SalliOverride Ei mitään

SalliOverride all

Seuraa SymLinksiä ja SymLinksIfOwnerMatchia

Jos FollowSymLinks-vaihtoehto on otettu käyttöön hakemistossa, Apache seuraa symbolisia linkkejä kyseisessä hakemistossa. Jos SymLinksIfOwnerMatch-vaihtoehto on käytössä, Apache seuraa symbolisia linkkejä vain, jos linkin osoittaman tiedoston tai hakemiston omistaja vastaa määritetyn hakemiston omistajaa. Siksi, kun SymLinksIfOwnerMatch-vaihtoehto on käytössä, Apache tekee lisää järjestelmäpyyntöjä. Lisäksi tarvitaan lisäkyselyjä, kun FollowSymlinks-toimintoa ei ole määritetty. Siksi optimaalinen suorituskykyvaihtoehto olisi ottaa käyttöön FollowSymlinks-vaihtoehto, tietysti, jos suojauskäytäntö sallii sen.

Sisältöneuvottelut

kohdassa määritelty mekanismi HTTP-määritykset, joka mahdollistaa asiakirjan eri versioiden (resurssien esityksen) tarjoamisen samalle URI:lle, jotta asiakas voi määrittää, mikä versio sopii paremmin sen ominaisuuksiin. Kun asiakas lähettää pyynnön palvelimelle, se kertoo palvelimelle, minkä tyyppisiä tiedostoja se ymmärtää. Jokaisella tyypillä on luokitus, joka kuvaa kuinka hyvin asiakas sen ymmärtää. Siten palvelin pystyy tarjoamaan resurssista version, joka paras tapa vastaa asiakkaan tarpeita.

On helppo nähdä, mitä tämä tarkoittaa palvelimen suorituskyvylle, joten vältä sisältöneuvottelujen käyttöä.

MaxClients

MaxClients-direktiivi määrittää palvelimen tukemien samanaikaisten pyyntöjen enimmäismäärän. MaxClient-arvo ei saa olla liian pieni, muuten monet asiakkaat estetään. Et voi asentaa liian montaa - tämä voi johtaa resurssien puutteeseen ja palvelimen kaatumiseen. Suunnilleen MaxClients = verkkopalvelimelle varatun muistin määrä / enimmäiskoko lapsiprosessi tai lanka. Staattisille tiedostoille Apache käyttää noin 2-3 Mt prosessia kohden, dynaamisille tiedostoille (php, cgi) - riippuu komentosarjasta, mutta yleensä noin 16-32 Mt. Jos palvelin palvelee jo MaxClients-pyyntöjä, uudet pyynnöt asetetaan jonoon, joiden koko on asetettu ListenBacklog-käskyllä.

MinSpareServers, MaxSpareServers ja StartServers

Säikeen ja erityisesti prosessin luominen vaatii resursseja, joten Apache luo ne varaukseen. MaxSpareServers- ja MinSpareServers-käskyt määrittävät prosessien/säikeiden vähimmäis- ja enimmäismäärän, joiden on oltava valmiita hyväksymään pyyntö. Jos MinSpareServers-arvo on liian pieni ja pyyntöjä on paljon, Apache alkaa luoda monia uusia prosesseja/säikeitä, mikä aiheuttaa tarpeetonta kuormitusta ruuhka-aikoina. Jos MaxSpareServers on liian suuri, Apache kuormittaa järjestelmää tarpeettomasti, vaikka pyyntöjen määrä olisi minimaalinen.

Empiirisesti sinun on valittava sellaiset arvot, jotta Apache ei luo enempää kuin 4 prosessia/säiettä sekunnissa. Jos se luo enemmän kuin 4, vastaava merkintä tehdään ErrorLogiin - signaali, että MinSpareServersiä on lisättävä.

MaxRequestsPer Child

MaxRequestsPerChild-direktiivi määrittää pyyntöjen enimmäismäärän, jonka yksi alatason prosessi/säie voi käsitellä ennen sen päättymistä. Oletuksena arvo on 0, mikä tarkoittaa, että se ei koskaan valmistu. On suositeltavaa asettaa MaxRequestsPerChild yhtä suureksi kuin pyyntöjen määrä tunnissa. Se ei luo ylimääräistä kuormaa palvelimelle ja samalla auttaa pääsemään eroon lapsiprosessien muistivuotojen ongelmista (esimerkiksi jos käytät epävakaa php-versiota).

KeepAlive ja KeepAliveTimeout

KeepAlive antaa sinun tehdä useita pyyntöjä yhdellä TCP-yhteydellä. Käytettäessä frontend+backend-mallia nämä käskyt eivät ole merkityksellisiä.

HTTP-pakkaus

Nyt kaikki nykyaikaiset asiakkaat ja lähes kaikki palvelimet tukevat HTTP-pakkausta. Pakkaamisen avulla voit vähentää asiakkaan ja palvelimen välistä liikennettä jopa 4 kertaa ja lisää samalla palvelimen prosessorin kuormitusta. Mutta jos palvelimella vierailee monia asiakkaita hitailla kanavilla, pakkaus voi vähentää kuormitusta vähentämällä pakatun vastauksen lähetysaikaa. Samalla lapsiprosessin käyttämät resurssit vapautuvat nopeammin ja samanaikaisten pyyntöjen määrä vähenee. Tämä on erityisen havaittavissa muistirajoitteissa.

Huomaan, että sinun ei pidä asettaa tutkintoa gzip-pakkaus enemmän kuin 5, koska prosessorin kuormitus kasvaa merkittävästi ja pakkaussuhde kasvaa hieman. Älä myöskään pakkaa tiedostoja, joiden muoto jo edellyttää pakkausta - siinä on melkein kaikki multimediatiedostoja ja arkistot.

Asiakaspuolen välimuisti

Älä unohda asentaa Vanhenee otsikot staattisille tiedostoille (mod_expires-moduuli). Jos tiedosto ei muutu, sinun tulee aina ohjeistaa asiakasta tallentamaan se välimuistiin. Tässä tapauksessa asiakkaan sivut latautuvat nopeammin ja palvelin pääsee eroon tarpeettomista pyynnöistä.

Lokien poistaminen käytöstä

Lokien poistaminen käytöstä auttaa kestämään tilapäisesti kuorman ruuhka-aikoina. Tämä toimenpide vähentää merkittävästi kaikentyyppisten ohjelmistojen kuormitusta ja on yleinen ratkaisu kriittisessä tilanteessa. Luonnollisesti sitä ei voida suositella käytettäväksi ilmeisten puutteiden kanssa ja se toimii vain väliaikaisena ratkaisuna ongelmaan.

Nginx

Yksinkertainen ja kevyt verkkopalvelin, joka on erityisesti suunniteltu käsittelemään staattisia pyyntöjä. Syy sen suorituskykyyn on se, että työprosessit palvelevat useita yhteyksiä samanaikaisesti, multipleksoivat ne käyttöjärjestelmäkutsuilla select-, epoll- (Linux) ja kqueue-kutsuilla (FreeBSD). Palvelimella on tehokas muistinhallintajärjestelmä, joka käyttää pooleja. Vastaus asiakkaalle luodaan puskureissa, jotka tallentavat tietoja joko muistiin tai osoittavat tiedoston osaan. Puskurit yhdistetään ketjuiksi, jotka määrittävät järjestyksen, jossa data siirretään asiakkaalle. Jos käyttöjärjestelmä tukee tehokkaita I/O-toimintoja, kuten writev Ja Lähetä tiedosto, Tuo Nginx, soveltaa niitä aina kun mahdollista.

Kun Nginx käytetään yhdessä Apachen kanssa, se on määritetty käsittelemään staattista dataa ja sitä käytetään kuormituksen tasapainottamiseen. Suurin osa ajasta se käyttää vain staattisen sisällön näyttämiseen, ja se tekee sen erittäin nopeasti ja vähäisin kustannuksin.

Lighttpd

"Nopeaksi, turvalliseksi ja standardien mukaiseksi suunniteltu verkkopalvelin." – Wikipedia

Se on vaihtoehto Nginxille ja sitä käytetään samoihin tarkoituksiin.

PHP kiihdyttimet

Tällaisten tuotteiden toimintaperiaate on, että ne tallentavat komentosarjatavukoodin välimuistiin ja vähentävät PHP-tulkin kuormitusta.

Olemassa olevat ratkaisut

Vaihtoehtoinen PHP-välimuisti on suunniteltu ilmaiseksi, avoimeksi ja vakaaksi kehykseksi PHP-lähdekoodin välimuistiin tallentamiseen ja optimointiin. Tukee PHP4 ja PHP5, mukaan lukien 5.3.

eAccelerator on ilmainen avoin projekti, joka suorittaa myös kiihdyttimen, optimoijan ja purkajan rooleja. Sisältää sisäänrakennetut dynaamisen sisällön välimuistiominaisuudet. On mahdollista optimoida PHP-skriptejä. Tukee PHP4 ja PHP5, mukaan lukien 5.3.

PhpExpress on ilmainen kiihdytin PHP-skriptien käsittelyyn web-palvelimella. Tukee myös Nu-Coderin kautta koodattujen tiedostojen lataamista. Tukee PHP4 ja PHP5, mukaan lukien 5.3

XCache tukee PHP4:ää ja PHP5:tä, mukaan lukien 5.3. Versiosta 2.0.0 alkaen (julkaisuehdokas päivätty 2012-04-05) mukana on tuki PHP 5.4:lle.

Windowsin välimuisti Laajennus varten PHP - PHP-kiihdytin Microsoft IIS:lle (BSD-lisenssi). Tukee vain PHP:tä (5.2 ja 5.3).

Välimuistin logiikka

"Välimuisti, välimuisti ja vielä kerran välimuisti!" - Tämä on erittäin kuormitetun järjestelmän motto.

Kuvitellaanpa ihanteellinen paljon kuormitettu verkkosivusto. Palvelin vastaanottaa http-pyynnön asiakkaalta. Käyttöliittymä vastaa pyyntöä fyysinen tiedosto palvelimella ja lähettää sen, jos se on olemassa. Skriptien ja kuvien lataaminen jätetään pois, koska tämä on enimmäkseen staattista ja palvellaan saman periaatteen mukaisesti. Lisäksi, jos tiedostoa ei ole fyysisesti olemassa, käyttöliittymä tekee tämän pyynnön taustajärjestelmälle, joka käsittelee logiikan ( php-skriptit jne.). Taustajärjestelmän on päätettävä, tallennetaanko se välimuistiin tämä pyyntö ja luo tiedosto sisään tietty paikka, joka annetaan käyttöliittymälle tulevaisuudessa. Siksi olemme tallentaneet tämän pyynnön ikuisesti välimuistiin ja palvelin käsittelee sen mahdollisimman nopeasti mahdollisimman pienellä kuormituksella.

The täydellinen esimerkki Sopii sivuille, joiden sisältö ei muutu ajan myötä tai muuttuu harvoin. Käytännössä meillä on sivuja, joiden sisältö voi muuttua jokaisen seuraavan pyynnön yhteydessä. Tai pikemminkin osa tätä sisältöä. Esimerkki tällaisesta sisällöstä olisi Käyttäjän tiedot, jonka pitäisi muuttua viiveellä, joka ei ole käyttäjälle näkyvissä tai näytetään reaaliajassa (päivitetään aina, kun sivu ladataan uudelleen). Tässä kohtaamme tehtävän, joka liittyy sivun dynaamisten ja staattisten tietojen erottamiseen.

Kätevin ja yleisin tapa jakaa tiedot on jakaa sivu lohkoihin. Tämä on loogista ja kätevää, koska sivu koostuu asettelun näkökulmasta lohkoista. Luonnollisesti logiikkaa ei tässä tapauksessa voida välttää, mutta tämä logiikka käsitellään alhaisin kustannuksin.

Siten asiakaspyyntö (paitsi staattinen pyyntö) ohjataan uudelleen taustajärjestelmään ja sen käsittely rajoitetaan seuraaviin toimiin:

  1. Tietojen saaminen sivulla olevista lohkoista.
  2. Tarkistetaan kunkin lohkon välimuistitietoja. Välimuistia ei ehkä ole olemassa tai se on ehkä päivitettävä. Tässä tapauksessa luomme välimuistitiedoston. Jos lohkoa ei pitäisi tallentaa välimuistiin, suoritamme oikean logiikan. Tietoja välimuistista voidaan tallentaa nosql-tietokantaan tai tiedostorakenteeseen. On vain yksi vaatimus: näiden tietojen hankkimisen tulee vaatia mahdollisimman vähän resursseja.
  3. Luomme html-sivuja. Upotamme välimuistissa olevat lohkot ssi-ohjeiden avulla (linkki välimuistitiedostoon lisätään), mikä säästää merkittävästi muistia.
  4. Sivu siirtyy käyttöliittymään, joka korvaa kaikki ssi-ohjeet tiedostojen sisällöllä ja toimittaa sivun asiakkaalle.

Myös yleistä on funktion tai luokkamenetelmän suorittamisen tulosten tallentaminen välimuistiin. Samalla välitetään välimuistifunktiolle viittaus objektiin (jos kutsumme menetelmää), menetelmän tai funktion nimi (jos se on globaali toiminto) ja tälle menetelmälle tai toiminnolle tarkoitetut parametrit. Välimuistitoiminto tarkistaa välimuistitiedoston olemassaolon, rakentaa tai lukee sen tarvittaessa ja palauttaa sitten tuloksen.

Tämä yleinen kuvaus suuren kuormituksen kohteen toimintaperiaate. Erityinen toteutus eroavat yksityiskohdista, mutta konsepti pysyy samana.

Kuvia, kuvia, yöpöydät

Osoittautuu, että kuva voidaan myös tallentaa välimuistiin. Minkä vuoksi? Kysyt. Periaatteessa palvelimelle lataamisen jälkeen meillä on jo tiedosto, jonka käyttöliittymä sylkee tarvittaessa nopeasti ulos. Mutta usein meidän on hankittava toinen kuva (esimerkiksi erikokoinen) olemassa olevan kuvan perusteella. Oletetaan, että tarvitsemme kuvan pikkukuvan (sängyn slangi). Tässä tapauksessa meidän on vain luotava polku seuraavaan pikkukuvatiedostoon ja annettava sivu asiakkaalle.

  1. Asiakas saatuaan lähde sivu, alkaa ladata staattista tietoa ja pyytää käyttöliittymään tällä hetkellä olematonta kuvaa.
  2. Käyttöliittymä uudelleenohjaa olemattomia kuvia koskevat pyynnöt taustajärjestelmään.
  3. Taustaohjelma analysoi pyynnön, luo kuvatiedoston ja palauttaa binääritiedot asianmukaisella http-otsikolla.
  4. Kaikki myöhemmät pyynnöt lähettää käyttöliittymä.

PHP-cgi-prosessit syövät muistia, lisääntyvät eksponentiaalisesti eivätkä halua kuolla FcgidMaxRequestsPerProcess-rajan umpeutumisen jälkeen, minkä jälkeen php-cgi alkaa aktiivisesti pudottaa kaikkea swapiin ja järjestelmä alkaa antaa "502" Huono portti ".

Vastaanottaja rajoittaa haarautuneiden php-cgi-prosessien määrää, ei riitä, että asetetaan FcgidMaxRequestsPerProcess, jonka käsittelyn jälkeen prosessien pitäisi kuolla, mutta ne eivät aina tee tätä vapaaehtoisesti.

Tilanne on tuskallisen tuttu kun php-cgi prosessoi ( lapset) lisääntyvät syöden heidän muistinsa, mutta niitä ei voi pakottaa kuolemaan - s.ki haluaa elää :) Tulee mieleen ongelma maapallon "ihmisten" ylikansoituksesta - eikö? ;)

Ikuinen epätasapaino esi-isien ja lasten välillä voidaan ratkaista rajoittamalla php-cgi-lasten määrää ja heidän elinikää ( kansanmurha) ja niiden lisääntymistoiminnan valvonta ( ehkäisy).

Rajoittaa php-cgi-prosessien määrää mod_fcgidille

Alla olevat ohjeet toimivat luultavasti eniten päärooli V rajoittaa php-cgi-prosessien määrää ja useimmissa tapauksissa tässä annetut oletusasetukset ovat haitallisia palvelimille, joiden RAM-muisti on alle 5-10 Gt:

  • FcgidMaxProcesses 1000- prosessien enimmäismäärä, jotka voivat olla aktiivisia samanaikaisesti;
  • FcgidMaxProcessesPerClass 100- prosessien enimmäismäärä yhdessä luokassa ( segmentti), eli suurin määrä prosesseja, jotka voidaan synnyttää saman kääreen läpi ( kääre - kääre);
  • FcgidMinProcessesPerClass 3- prosessien vähimmäismäärä yhdessä luokassa ( segmentti), eli minimimäärä saman kääreen kautta käynnistettyjä prosesseja ( kääre - kääre), joka on käytettävissä, kun kaikki pyynnöt on suoritettu;
  • FcgidMaxRequestsPerProcess 0- FastCGI:n pitäisi "pelaa laatikossa" tämän määrän pyyntöjä suorittamisen jälkeen.

Mikä php-cgi-prosessien määrä tulee olemaan optimaalisin? Tarvittavien php-cgi-prosessien optimaalisen määrän määrittämiseksi (pub) Rekisteröidy sivuillamme! :)(/pub)(reg) ottaa huomioon RAM-muistin kokonaismäärän ja PHP:lle varatun muistin koon kohdassa memory_limit ( php.ini), joita jokainen php-cgi-prosessi voi kuluttaa PHP-skriptiä suoritettaessa. Joten jos meillä on esimerkiksi 512 Mt, josta 150-200 on varattu itse käyttöjärjestelmälle, vielä 50-100 tietokantapalvelimelle, sähköpostin MTA:lle jne. ja memory_limit=64, niin tässä tapauksessa meidän 200- 250 Mt RAM-muistia, voimme ajaa 3-4 php-cgi-prosessia samanaikaisesti ilman suuria vaurioita.(/reg)

PHP-cgi-prosessin käyttöiän aikakatkaisuasetukset

Php-cgi-lasten aktiivisella lisääntymisellä, syömällä RAM-muistia, he voivat elää melkein ikuisesti, ja tämä on täynnä kataklysmejä. Alla on luettelo GMO-direktiiveistä, jotka auttavat vähentämään php-cgi-prosessien käyttöikä ja vapauttamaan niiden käyttämät resurssit ajoissa:

  • FcgidIOTimeout 40- aika ( sekunnissa), jonka aikana mod_fcgid-moduuli yrittää suorittaa komentosarjan.
  • FcgidProcessLifeTime 3600- jos prosessi on olemassa pidempään kuin tämä aika ( sekunneissa), se on merkittävä tuhottavaksi seuraavan prosessiskannauksen aikana, jonka aikaväli on määritelty FcgidIdleScanInterval-direktiivissä;
  • FcgidIdleTimeout 300- jos prosessien määrä ylittää FcgidMinProcessesPerClass , niin prosessi, joka ei käsittele pyyntöjä tänä aikana (sekunteina), merkitään tappavaksi seuraavan prosessiskannauksen aikana, jonka aikaväli on asetettu FcgidIdleScanInterval-direktiivissä;
  • FcgidIdleScanInterval 120- aikaväli, jonka aikana mod_fcgid-moduuli etsii prosesseja, jotka ovat ylittäneet FcgidIdleTimeout- tai FcgidProcessLifeTime-rajat.
  • FcgidBusyTimeout 300- jos prosessi on varattu käsittelemään pyyntöjä tämän ajan jälkeen ( sekunnissa), sitten seuraavan tarkistuksen aikana, jonka aikaväli on määritetty FcgidBusyScanInterval -kohdassa, tällainen prosessi merkitään tappamista varten;
  • FcgidBusyScanInterval 120- aikaväli, jonka kuluessa FcgidBusyTimeout-rajan ylittäneiden kiireisten prosessien skannaus ja etsiminen suoritetaan;
  • FcgidErrorScanInterval 3- intervalli ( sekunnissa), jonka kautta mod_fcgid-moduuli tappaa valmistumista odottavat prosessit, mukaan lukien. ja ne, jotka ovat ylittäneet FcgidIdleTimeout tai FcgidProcessLifeTime . Tappaminen tapahtuu lähettämällä SIGTERM-signaali prosessiin, ja jos prosessi pysyy aktiivisena, se lopetetaan SIGKILL-signaalilla.

On otettava huomioon, että prosessi, joka on ylittänyt FcgidIdleTimeout tai FcgidBusyTimeout, voi elää + toinen FcgidIdleScanInterval tai FcgidBusyScanInterval aika, jonka jälkeen se merkitään tuhottavaksi.

On parempi asettaa ScanIntervals useiden sekuntien erolla, esimerkiksi jos FcgidIdleScanInterval 120, niin FcgidBusyScanInterval 117 - ts. jotta prosesseja ei tarkisteta samanaikaisesti.

PHP-cgi-prosessin synnytystoiminta

Jos mikään yllä olevista ei auttanut, mikä on yllättävää, voit myös kokeilla temppuja php-cgi-prosessien synnyttämisessä...

Pyyntöjen lukumäärää, php-cgi-prosesseja ja niiden elinikää koskevien rajoitusten lisäksi on olemassa myös sellainen asia kuin synnyttävien lapsiprosessien toiminta, jota voidaan säädellä sellaisilla direktiiveillä kuin FcgidSpawnScore, FcgidTerminationScore, FcgidTimeScore ja FcgidSpawnScoreUpLimit, jonka käännös porvaristosta mielestäni annoin oikean käännöksen ( oletusarvot näytetään):FcgidSpawnScoreUpLimit, sovelluksen aliprosesseja ei synny, ja kaikkien spawn-pyyntöjen on odotettava, kunnes olemassa oleva prosessi vapautuu tai kunnes tulos ( Pisteet) ei laske tämän rajan alapuolelle.

Jos käännös yllä olevien parametrien kuvauksesta ja ymmärrykseni on oikea, niin php-cgi-prosessin syntymisen vähentämiseksi sinun tulee alentaa FcgidSpawnScoreUpLimit-direktiivin arvoa tai lisätä FcgidSpawnScore- ja FcgidTerminationScore-arvoja.

Tulokset

Toivon, että olen listannut ja keskustellut yksityiskohtaisesti useimmista mod_fcgid-moduulin ohjeista, jotka auttavat rajoittaa php-cgi-tiedostojen määrää ja niiden käyttöikää ja myös vähentää resurssien kulutusta. Alla on täydellinen mod_fcgid-kokoonpano onnistuneesti toimivalle palvelimelle, jossa on 2500 MHz prosessori ja 512 Mt RAM:

Oleg Golovsky

Muutama tunti sitten Mozilla Firefox -selaimen versio 48 julkaistiin. Verrattuna edelliseen 47-versioon, se ei sisällä vain sitä, mitä voidaan kuvata "pieniksi muutoksiksi konepellin alla". Ensimmäistä kertaa virallisesti Firefoxin julkaisuversiossa alkaa näkyä monikäsittely, joka on oletuksena käytössä joillakin käyttäjillä.

Elektrolyysi

Nykyaikaiselle selaimelle monikäsittely on merkki hyvästä muodosta. Kaikissa selaimissa on välilehtiä, ja jokainen välilehti monisäikeisessä tilassa on erillinen, eristetty prosessi. Tämän lähestymistavan etuja eivät ole vain lisäturvatoimenpiteet ja useiden hyökkäysten poissulkeminen. Voit siirtää välilehtiä, lisäosia ja laajennuksia erillisiin prosesseihin, esimerkiksi Adobeen Flash Player. Jos jokin prosesseista epäonnistuu, voit jatkaa työtä käynnistämättä koko selainta uudelleen. Erilaiset muistivuodot eliminoidaan, suorituskyky paranee tehtävien rinnakkaisemisen vuoksi useisiin prosessoriytimiin. Jos jokin välilehdistä kuluttaa paljon resursseja, käyttöliittymä ei jumiudu, vaan vastaa edelleen.

Melkein kaikilla on moniprosessointi suositut selaimet: Google Chrome, Internet Explorer, Microsoft Edge, Apple Safari. Mozilla Firefox ottaa kiinni. Elektrolyysi tai e10s on monisäikeinen tekniikka Firefoxissa. Ensimmäisessä versiossa on kaksi prosessia: yksi selaimen välilehtiä varten, toinen käyttöliittymää varten. Seuraavissa versioissa sisällölle on useita prosesseja.

Versiossa 48 Electrolysis sisältyy julkaisuversioon ensimmäistä kertaa. Mutta ei kaikille, vaan vain yhdelle prosentille käyttäjistä. Jos Mozilla on tyytyväinen testituloksiin, niin kymmenen päivän kuluttua osuus nousee noin puoleen käyttäjistä.

Monikäsittely voidaan ottaa käyttöön itsenäisesti. Varmista, mikä versio sinulla on, kirjoittamalla osoitepalkkiin about:support ja etsimällä riviä Multiprocess Windows.

Kaikki laajennukset eivät ole yhteensopivia elektrolyysin kanssa. Näet luettelot suosituimmista lisäosista Are We e10s Yet -sivustolla, jossa ilmoitetaan niiden yhteensopivuus Firefoxin monisäikeisessä tilassa. Voit ottaa elektrolyysin käyttöön välittömästi ja sammuttaa sen myöhemmin, jos tärkeät lisäosat rikkoutuvat.

Pakollinen parametri about:config (kirjoita sisään osoitekenttä ja paina "Enter") - browser.tabs.remote.autostart. Parametrin arvoksi on asetettava tosi kaksoisnapsauttamalla.

Kun selain on käynnistetty uudelleen, elektrolyysi voi alkaa toimia. Joskus jokin lisäosa häiritsee sen sisällyttämistä.

Voit kiertää tämän rajoituksen luomalla uuden loogisen vakion about:config-tiedostoon browser.tabs.remote.force-enable ja määritä se totta.

Nyt elektrolyysi toimii pakotetussa moniprosessitilassa. (Huomaa, että tämä saattaa vaikuttaa joidenkin lisäosien suorituskykyyn.) About:support -kohdassa 1/1 (Käyttäjän sallima) näkyy Multiprocess Windows -kohdan vieressä.

Laajennusten allekirjoittaminen pakollinen

Elektrolyysi voidaan ottaa käyttöön tai poistaa käytöstä about:config -sovelluksella. Mutta ei ole enää tapaa poistaa käytöstä asennetun laajennuksen pakollista allekirjoitusta. Vaihtoehto katosi, kuten oli tarkoitus.

Tämän seurauksena pakolliset allekirjoitukset, joita ei ole poistettu käytöstä, ilmestyivät vain nykyisessä versiossa 48. Sähköinen allekirjoitus laajennukselle saadaan osoitteesta addons.mozilla.org (AMO) riippumatta siitä, onko laajennus julkaistu AMO:ssa vai ei. AMO:n pakollisen allekirjoituksen hankkimista koskevan vaatimuksen tarkoitus on käyttäjien turvallisuus. Järjestelmä suodattaa haitalliset laajennukset mustalla listalla.

Muut muutokset

Firefox 49 ei enää tue Android 2.3 (Gingerbread), OS X -versioita 10.6 (Snow Leopard), 10.7 (Lion) ja 10.8 ( Vuorileijona). Nämä käyttöjärjestelmät ilmestyivät 4-6 vuotta sitten.

Mitä seuraavaksi?

Firefox Hello on WebRTC-teknologiaan rakennettu yhteistyö- ja viestintätyökalu ääni- ja videokeskusteluihin. Palvelu on rakennettu Firefoxiin versiosta 34 lähtien. Hello saattaa kadota versiossa 49. Virheenseurantaohjelma keskustelee Hellon poistamisesta selaimesta seuraavassa versiossa. Syynä poistoon oli kehitysprioriteettien muutos. SISÄÄN iltainen rakentaminen Nightly 51 ja Aurora 50:n varhainen versio Hello-palvelu on jo kadonnut. Kirjoitushetkellä Beta 49 ei ole vielä saatavilla.

Aiemmin teemat ja välilehtiryhmät poistettiin Firefoxista käytön puutteen vuoksi. Vähemmän suosittujen ominaisuuksien tuki hidasti uusien versioiden julkaisua. Ehkä he haluavat poistaa Hellon samasta syystä.

Firefox jatkaa vanhojen järjestelmien tuen poistamista. Versiossa 49, joukko ohjeita keskusprosessori SSE2 on pakollinen Firefox toimii Windowsin alla. Puhumme prosessorien hylkäämisestä ennen Pentium 4- ja Ahtlon 64 -aikakautta.

Tämä on neljäs artikkeli "Breaking the Windows Limits" -sarjassa, jossa puhun Windowsin perusresurssien rajoituksista. Tällä kertaa aion keskustella kanssasi Windowsin tukemien säikeiden ja prosessien enimmäismäärän rajoituksista. Tässä kuvailen lyhyesti säikeen ja prosessin eroa, kyselysäikeen rajoitusta, ja sitten puhumme prosessin rajoituksista. Ensinnäkin päätin puhua säikeiden rajoituksista, koska jokaisessa aktiivisessa prosessissa on vähintään, yhdellä säikeellä (prosessilla, joka on poistunut mutta jonka viite on tallennettu toisen prosessin tarjoamaan käsittelijään, ei ole säiettä), joten prosessin rajat ovat suoraan riippuvaisia ​​taustalla olevista säikeiden rajoista.

Toisin kuin jotkin UNIX-versiot, useimmat Windowsin resurssit niillä ei ole kiinteää rajaa sisäänrakennettuna käyttöjärjestelmään rakennusaikana, vaan ne saavat rajoituksia käyttöjärjestelmän käytettävissä olevien taustalla olevien resurssien perusteella, mistä puhuin aiemmin. Esimerkiksi prosessit ja säikeet vaativat itsensä fyysinen muisti, näennäismuisti ja poolimuisti, eli prosessien ja säikeiden määrä, jotka voidaan luoda tietylle alueelle Windows-järjestelmä, määräytyy lopulta jonkin näistä resursseista riippuen siitä, kuinka nämä prosessit tai säikeet on luotu ja mikä taustalla olevista resurssirajoista saavutetaan ensin. Siksi suosittelen, että luet aiemmat artikkelini, jos et ole jo tehnyt niin, koska seuraavaksi viittaan käsitteisiin, kuten varattu muisti, varattu muisti ja järjestelmämuistiraja, joista puhuin aiemmissa artikkeleissani:

Prosessit ja säikeet
Windows-prosessi on pohjimmiltaan säilö, joka tallentaa komentokoodin suoritettavasta tiedostosta. Se edustaa ytimen prosessiobjektia, ja Windows käyttää tätä prosessiobjektia ja siihen liittyviä tietorakenteita tietojen tallentamiseen ja ylläpitämiseen sovelluksen suorituskoodista. Esimerkiksi prosessilla on virtuaalinen osoiteavaruus, johon sen yksityiset ja julkiset tiedot on tallennettu ja johon suoritettava kuva ja siihen liittyvät DLL:t on kartoitettu. Windows käyttää diagnostiikkatyökaluja tallentaakseen tietoja prosessin resurssien käytöstä, mikä auttaa seuraamaan ja suorittamaan pyyntöjä, ja tallentaa prosessin viittaukset käyttöjärjestelmäobjekteihin prosessin hallintataulukkoon. Prosessit toimivat suojauskontekstin kanssa, jota kutsutaan tunnukseksi, joka tunnistaa käyttäjätilin, ryhmän tili ja prosessille annetut oikeudet.

Prosessi sisältää yhden tai useamman säikeen, jotka todella suorittavat koodia prosessissa (teknisesti ei suorita prosesseja, vaan säikeet) ja se esitetään järjestelmässä ytimen säieobjekteina. On useita syitä, miksi sovellukset luovat säikeitä alkuperäisen aloitussäikensä lisäksi: 1) prosessit, joilla on käyttöliittymä, luovat yleensä säikeitä tehdäkseen työnsä ja pitävät pääsäikeen reagoivana tietojen syöttämiseen ja ikkunoiden hallintaan liittyviin käyttäjän komentoihin; 2) Sovellukset, jotka haluavat käyttää useita prosessoreita suorituskyvyn skaalaamiseen tai jotka haluavat jatkaa toimintaansa säikeiden pysähtyessä odottaen I/O:n synkronointia, luovat säikeitä hyödyntääkseen monisäikeistystä.

Viestirajoitukset
Säiettä koskevien perustietojen, mukaan lukien CPU-rekisterien tila, säikeen prioriteetti ja tiedot säikeen resurssien käytöstä, lisäksi jokaisella säikeellä on varattu osa prosessin osoiteavaruudesta, nimeltään pino, jota säie voi käyttää työmuisti ohjelmakoodin suorituksen aikana toimintoparametrien välittämiseen, paikallisten muuttujien ja funktiotulosten osoitteiden tallentamiseen. Näin ollen järjestelmän virtuaalimuistin tuhlaamisen välttämiseksi vain osa pinosta varataan aluksi tai osa siitä siirretään säikeeseen ja loput yksinkertaisesti varataan. Koska muistipinot kasvavat laskevassa järjestyksessä, järjestelmä sijoittaa niin sanotut "suojasivut" muistin varatun osan ulkopuolelle, mikä varmistaa automaattisen allokoinnin. lisämuistia(kutsutaan pinolaajennukseksi) kun tarvitset sitä. Seuraavassa kuvassa näkyy, kuinka varattu pinoalue syvenee ja kuinka suojasivut liikkuvat pinon laajentuessa 32-bittisessä osoiteavaruudessa:

Suoritettavien kuvien Portable Executable (PE) -rakenteet määrittävät säikeen pinolle varatun ja alun perin varatun osoitetilan määrän. Oletusarvoisesti linkkijä varaa 1 Mt ja varaa yhden sivun (4KB), mutta kehittäjät voivat muuttaa näitä arvoja joko muuttamalla PE-arvoja kommunikoidessaan ohjelmansa kanssa tai kutsumalla CreateTread-funktiota erillisessä säikeessä. Voit käyttää Visual Studion mukana tulevaa apuohjelmaa, kuten Dumpbinia, tarkastellaksesi suoritettavan ohjelman asetuksia. Tässä ovat tulokset Dumpbinin suorittamisesta /headers-vaihtoehdolla uuden Visual Studio -projektin luomassa suoritettavassa tiedostossa:

Numeroiden muuntaminen heksadesimaalijärjestelmä calculus, voit nähdä, että pinon varannon koko on 1 Mt ja varattu muistialue on 4 kt; Käyttämällä Sysinternalsin uutta MMap-apuohjelmaa voit liittää prosessiin ja tarkastella sen osoiteavaruutta ja näin nähdä prosessille alun perin varatun pinomuistisivun, suojasivun ja muun varatun pinomuistin:

Koska jokainen säiettä kuluttaa osan prosessin osoiteavaruudesta, prosesseilla on perusrajoitus niiden luomien säikeiden lukumäärälle. yhtä suuri kuin koko niiden osoiteavaruus jaettuna säikeen pinon koolla.

32-bittisten streamien rajoitukset
Vaikka prosessilla ei olisi lainkaan koodia tai dataa ja koko osoiteavaruus voitaisiin käyttää pinoihin, 32-bittinen prosessi, jonka oletusosoiteavaruus on 2 tavua, voisi luoda enintään 2048 säiettä. Tässä ovat tulokset Testlimitistä, joka toimii 32-bittisessä Windowsissa valinnalla -t (säikeen luominen), mikä vahvistaa tämän rajoituksen olemassaolon:

Jälleen kerran, koska osa osoiteavaruudesta oli jo käytetty koodille ja alkukekomuistille, kaikki 2 Gt ei ollut käytettävissä säikeen pinoissa, joten luotujen säikeiden kokonaismäärä ei voinut saavuttaa teoreettista 2048 säiettä.

Yritin ajaa Testlimitin kanssa lisävaihtoehto, joka antaa sovellukselle laajennetun osoitetilan toivoen, että jos sille annetaan enemmän kuin 2 Gt osoiteavaruutta (esimerkiksi 32-bittisissä järjestelmissä, tämä saavutetaan suorittamalla sovellus /3GB- tai /USERVA-vaihtoehdolla käynnistykselle. ini, tai vastaava BCD-vaihtoehto Vistassa ja myöhemmässä lisäysservassa), se käyttää sitä. 32-bittisille prosesseille on varattu 4 Gt osoitetilaa käytettäessä 64-bittisessä Windowsissa, joten kuinka monta säiettä 64-bittisessä Windowsissa toimiva 32-bittinen Testlimit voi luoda? Aiemmin keskustellemme perusteella vastauksen pitäisi olla 4096 (4 Gt jaettuna 1 Mt), mutta käytännössä tämä luku on paljon pienempi. Tässä on 32-bittinen Testlimit, joka toimii 64-bittisessä Windows XP:ssä:

Syy tähän eroon on siinä, että kun suoritat 32-bittistä sovellusta 64-bittisessä Windowsissa, se on itse asiassa 64-bittinen prosessi, joka suorittaa 64-bittistä koodia 32-bittisten säikeiden puolesta, ja siksi sillä on - säikeen muistialueet on varattu 64- ja 32-bittisille säikeille. 64-bittiselle pinolle on varattu 256 kt (poikkeuksia ovat ennen Vistaa julkaistut käyttöjärjestelmät, joissa alkuperäinen koko 64-bittisten säikeiden pino on 1 Mt). Koska jokainen 32-bittinen säiettä alkaa 64-bittisessä tilassa ja pinon koko, joka sille varataan käynnistyksen yhteydessä, on suurempi kuin sivun koko, useimmissa tapauksissa näet, että 64-bittisen säikeen pinolle on varattu vähintään 16 kt. Tässä on esimerkki 32-bittisen virran 64- ja 32-bittisistä pinoista (32-bittisen pinon nimi on "Wow64"):

32-bittinen Testlimit pystyi luomaan 3204 säiettä 64-bittisessä Windowsissa, mikä selittyy sillä, että jokainen säiettä käyttää 1 Mt + 256 kt pinoosoitetilaa (poikkeuksena ovat Windows Vistaa edeltävät versiot, jotka käyttävät 1 Mt + 1 Mt) . Sain kuitenkin erilaisen tuloksen, kun suoritin 32-bittistä Testlimitiä 64-bittisessä Windows 7:ssä:

Windows XP:n ja Windows 7:n tulosten väliset erot johtuvat osoitetilan allokointimallin monimutkaisemmasta luonteesta. Windows Vista, Address Space Layout Randomization (ASLR), joka johtaa pirstoutumiseen. DLL-latauksen, säikeen pinon ja pinon sijoittelun satunnaistaminen auttaa parantamaan haittaohjelmien suojausta. Kuten seuraavasta VMMap-vedoskuvasta näkyy, testijärjestelmässä on edelleen 357 Mt vapaata osoitetilaa, mutta suurin vapaa lohko on 128 kt, mikä on vähemmän kuin 32-bittiselle pinolle vaadittava 1 Mt:

Kuten totesin, kehittäjä voi ohittaa oletuspinon varauskoon. Yksi mahdollisia syitä Tämä voidaan tehdä osoitetilan tuhlaamisen välttämiseksi, kun tiedetään etukäteen, että säikeen pino käyttää aina vähemmän kuin oletusarvo 1 Mt. Testlimit PE -kuva käyttää oletusarvoisesti 64 kt:n pinovarauskokoa, ja kun määrität -n-vaihtoehdon yhdessä -t-valinnan kanssa, Testlimit luo säikeitä, joiden pinokoko on 64 kt. Tässä on tulos tämän apuohjelman suorittamisesta järjestelmässä, jossa on 32-bittinen Windows XP ja 256 Mt RAM (suoritin tämän testin erityisesti heikko järjestelmä, korostaa tätä rajoitusta):

Tässä on syytä huomata, että tapahtui toinen virhe, mikä tarkoittaa, että tässä tilanteessa syy ei ole osoiteavaruudessa. Itse asiassa 64 kt:n pinojen pitäisi tarjota noin 32 000 säiettä (2Gb/64Kb = 32768). Mikä rajoitus sitten ilmestyi tässä tapauksessa? Jos tarkastelet mahdollisia ehdokkaita, mukaan lukien varattu muisti ja pooli, ne eivät anna mitään vihjeitä vastauksen löytämiseen tähän kysymykseen, koska kaikki nämä arvot ovat rajojensa alapuolella:

Löydämme vastauksen osoitteesta lisäinformaatio muistista ytimen debuggerissa, joka näyttää meille vaaditun rajan, joka liittyy käytettävissä olevaan pysyvään muistiin, jonka koko määrä on käytetty loppuun:

Käytettävissä oleva pysyvä muisti on fyysistä muistia, joka on varattu datalle tai koodille, jonka on sijaittava RAM-muistissa. Sivuttamattoman poolin ja sivuttamattomien ajurien koot lasketaan itsenäisesti, kuten esimerkiksi RAM-muistissa I/O-toimintoja varten varattu muisti. Jokaisessa säikeessä on molemmat käyttäjätilan pinot, kuten olen jo maininnut, mutta niillä on myös etuoikeutettu-tilan (ytimen tilan) pino, jota käytetään, kun säikeet toimivat ydintilassa, kuten suoritettaessa. järjestelmäpuhelut. Kun säie on aktiivinen, sen ydinpino kiinnitetään muistiin, jotta säie voi suorittaa koodin ytimessä, jolle tarvittavat sivut ei voi olla poissa.

Perusydinpino vie 12 kt 32-bittisessä Windowsissa ja 24 kt 64-bittisessä Windowsissa. 14225 säiettä vaativat noin 170 megatavua pysyvää muistia, mikä on täsmälleen niin paljon vapaata muistia tässä järjestelmässä, kun Testlimit ei ole käytössä:

Kun käytettävissä on raja järjestelmämuisti, monet perustoiminnot alkavat epäonnistua. Esimerkiksi tässä on virhe, jonka sain kaksoisnapsauttaessani Internet Explorerin pikakuvaketta työpöydälläni:

Kuten odotettiin, Testlimit pystyi luomaan 6 600 säiettä 64-bittisessä Windowsissa, jossa on 256 Mt RAM-muistia - noin puolet niin monta säiettä kuin se pystyi luomaan 32-bittisessä Windowsissa, jossa on 256 Mt RAM-muistia - ennen kuin käytettävissä oleva muisti loppui:

Syy, miksi käytin aiemmin termiä "perus" ydinpino, on se, että grafiikka- ja ikkunointitoiminnot suorittava säie saa "ison" pinon, kun se tekee ensimmäisen kutsun, joka on yhtä suuri (tai suurempi kuin) 20 kt per 32-bittinen Windows ja 48 kt 64-bittisessä Windowsissa. Testlimit-säikeet eivät kutsu mitään tällaista API:ta, joten niissä on perusydinpinot.
64-bittisten streamien rajoitukset

Kuten 32-bittisissä säikeissä, 64-bittisissä säikeissä on oletuksena 1 Mt:n pinovaraus, mutta 64-bittisissä on paljon enemmän käyttäjäosoitetilaa (8 Tt), joten sen ei pitäisi olla ongelma luotaessa. Suuri määrä purot. Silti on selvää, että pysyvä käytettävissä oleva muisti on edelleen potentiaalinen rajoitin. Testlimitin 64-bittinen versio (Testlimit64.exe) pystyi luomaan -n-vaihtoehdon kanssa ja ilman - noin 6 600 säiettä järjestelmään, jossa oli 64-bittinen Windows XP ja 256 Mt RAM, täsmälleen sama kuin 32-bittinen versio. luotu, koska käytettävissä olevan muistin raja saavutettiin. Kuitenkin järjestelmässä, jossa on 2 Gt RAM-muistia, Testlimit64 pystyi luomaan vain 55 000 säiettä, mikä on huomattavasti vähemmän kuin niiden säikeiden määrä, jotka tämä apuohjelma voisi luoda, jos rajoituksena olisi pysyvä käytettävissä oleva muisti (2 Gt / 24 kt = 89 000):

Tässä tapauksessa syynä on säikeelle varattu alkupino, joka saa järjestelmän virtuaalimuistin loppumaan ja aiheuttaa sivutusvirheen. Kun varatun muistin määrä saavuttaa RAM-muistin koon, uusien säikeiden luontinopeus laskee merkittävästi, koska järjestelmä alkaa "luistaa", aiemmin luotuja säikeipinoja aletaan sivuttaa sivutiedostoon, jotta uusille säikeipinoille tulee tilaa, ja sivutiedoston täytyy kasvaa. Kun vaihtoehto -n on käytössä, tulokset ovat samat, koska varatun pinomuistin alkuperäinen määrä pysyy samana.

Prosessin rajoitukset
Windowsin tukemien prosessien määrän pitäisi luonnollisesti olla pienempi kuin säikeiden lukumäärä, koska jokaisessa prosessissa on yksi säie ja prosessi itsessään aiheuttaa lisäresurssien kulutusta. 32-bittinen Testlimit, joka toimii järjestelmässä, jossa on 64-bittinen Windows XP ja 2 Gt järjestelmämuistia, luo noin 8400 prosessia:

Jos katsot ytimen virheenkorjauksen tulosta, käy selväksi, että tässä tapauksessa käytettävissä olevan muistin raja saavutetaan:

Jos prosessi käyttää pysyvää käytettävissä olevaa muistia vain etuoikeutetun tilan säikeen pinoon, Testlimit pystyisi luomaan monia yli 8400 säiettä 2 Gt:n järjestelmään. Tämän järjestelmän vapaana olevan muistin määrä ilman Testlimitiä on 1,9 Gt:

Jakamalla Testlimitin käyttämän pysyvän muistin määrä (1,9 Gt) sen luomien prosessien määrällä, huomaamme, että jokaisessa prosessissa on 230 kt pysyvää muistia. Koska 64-bittinen ydinpino vie 24 kilotavua, prosessia kohden puuttuu noin 206 kt. Missä on loput käytetystä pysyvästä muistista? Kun prosessi luodaan, Windows varaa riittävästi fyysistä muistia toimittamaan sivuja vähimmäismäärän. Tämä tehdään sen varmistamiseksi, että prosessilla on kaikissa tilanteissa käytettävissään riittävästi fyysistä muistia, jotta se voi tallentaa tarvittavan määrän dataa sivujen vähimmäismäärän tuottamiseksi. Oletusarvoisesti työskentelysivujoukon koko on usein 200 kt, mikä voidaan tarkistaa helposti lisäämällä Minimum Working Set -sarake Process Explorer -ikkunaan:

Loput 6 kilotavua on pysyvää käytettävissä olevaa muistia, joka on varattu lisämuistille (englanninkielisestä ei-sivuttavasta muistista), johon itse prosessi on tallennettu. Prosessi 32-bittisessä Windowsissa käyttää hieman vähemmän pysyvää muistia, koska sen säikeen etuoikeutettu pino on pienempi.

Kuten käyttäjätilan säiepinoissa, prosessit voivat ohittaa oletusarvoisen työjoukon sivukoon käyttämällä SetProcessWorkingSetSize-toimintoa. Testlimit tukee valitsinta -n, joka yhdessä valitsimen -p kanssa sallii sinun asettaa työsivujoukon pienimmäksi mahdolliseksi kooksi 80 kb Testlimit-pääprosessin aliprosesseille. Koska aliprosessit tarvitsevat aikaa työskentelysivujoukkojensa vähentämiseen, Testlimit pysähtyy sen jälkeen, kun se ei enää pysty synnyttämään prosesseja, ja yrittää jatkaa toimintaansa, jolloin sen aliprosesseille on mahdollisuus suorittaa. Testlimitillä, joka käynnistettiin parametrilla -n Windows 7:llä ja 4 Gt RAM-muistilla varustetussa järjestelmässä, on eri raja kuin pysyvän käytettävissä olevan muistin raja - varatun järjestelmämuistin raja:

Alla olevassa kuvakaappauksessa näet, että ytimen virheenkorjausohjelma ei raportoi vain, että varattu järjestelmän muistiraja on saavutettu, vaan myös, että tämän rajan saavuttamisen jälkeen on tapahtunut tuhansia muistin varausvirheitä, sekä virtuaali- että muisti sivuttu pooli (varattu järjestelmämuistin raja saavutettiin itse asiassa useita kertoja, koska sivutiedoston kapasiteetin puutteesta johtuvan virheen sattuessa sama määrä kasvoi, mikä lyhensi tätä rajaa):

Ennen Testlimitin suorittamista keskimääräinen muistivaraus oli noin 1,5 Gt, joten säikeet veivät noin 8 Gt varattua muistia. Siksi jokainen prosessi kulutti noin 8 Gt/6600 tai 1,2 MB. Ytimen debugger!vm-komennon tulos, joka näyttää jakelun omaa muistia(englanninkielisestä yksityisestä muistista) jokaiselle prosessille, vahvistaa tämän laskelman oikeellisuuden:

Säikeen pinolle varatun muistin alkumäärällä, joka on kuvattu aiemmin, on vain vähän vaikutusta jäljellä oleviin muistinvarauspyyntöihin, joita tarvitaan prosessin osoiteavaruuden tietorakenteissa, sivutaulukon merkinnöissä, käsittelytaulukon merkinnöissä, prosessi- ja säieobjekteissa ja sen omissa tiedoissa. prosessi luo sen alustuksen aikana.

Kuinka monta prosessia ja säiettä riittää?
Siten vastaukset kysymyksiin "kuinka monta säiettä Windows tukee?" ja "kuinka monta prosessia voit suorittaa samanaikaisesti Windowsissa?" toisiinsa. Sen lisäksi, että säikeet määrittävät pinon koon ja kuinka prosessit määrittävät niiden vähimmäistyösivujoukon vivahteita, kaksi päätekijää, jotka määrittävät vastaukset näihin kysymyksiin missä tahansa järjestelmässä, ovat fyysisen muistin määrä ja järjestelmän muistin varausraja. Joka tapauksessa, jos sovellus luo tarpeeksi säikeitä tai prosesseja lähestyäkseen näitä rajoja, sen kehittäjän tulee harkita uudelleen kyseisen sovelluksen suunnittelua, koska aina on olemassa eri tavoilla saavuttaa sama tulos kohtuullisella määrällä prosesseja. Esimerkiksi sovelluksen skaalauksen päätavoite on pitää käynnissä olevien säikeiden määrä yhtä suurena kuin suorittimien lukumäärä, ja yksi tapa saavuttaa tämä on siirtyä synkronisesta I/O:sta asynkroniseen täydennysportteihin, mikä auttaa pitämään käynnissä olevien säikeiden lukumäärä, joka vastaa suorittimien määrää.

Ollenkaan, jos vain voitälä nosta Apache, Älä tee sitä. Harkitse, pystyykö lighttpd tai thttpd suorittamaan tarvitsemasi tehtävät. Nämä web-palvelimet voivat olla erittäin hyödyllisiä tilanteissa, joissa järjestelmäresurssit eivät riitä kaikille, mutta sen pitäisi toimia. Toistan vielä kerran: puhumme niistä tilanteista, joissa näiden tuotteiden toiminnallisuus riittää suorittamaan määrätyt tehtävät (muuten, lighttpd osaa työskennellä PHP). Niissä tilanteissa, joissa ilman Apache No, sitä ei yksinkertaisesti voi kiertää, voit yleensä vapauttaa paljon järjestelmäresursseja joka tapauksessa ohjaamalla pyynnöt staattiseen sisältöön (JavaScript, grafiikka) Apache kevyelle HTTP-palvelimelle. Suurin ongelma Apache on hänen suuri ruokahalunsa RAMille. Tässä artikkelissa tarkastelen menetelmiä, jotka nopeuttavat työtä ja vähentävät sen viemän muistin määrää:

  • käsittelee vähemmän rinnakkaisia ​​pyyntöjä;
  • kiertoprosessit;
  • käyttämällä ei liian pitkää KeepAlivesia;
  • aikakatkaisun vähentäminen;
  • hakkuuintensiteetin vähentäminen;
  • isäntänimen resoluution poistaminen käytöstä;
  • käytön estäminen .htaccess.
  • Ladataan vähemmän moduuleja

    Ensimmäinen askel on poistaa tarpeettomat moduulit latautumasta. Tarkista asetustiedostot ja määritä, mitä moduuleja olet lataamassa. Tarvitsetko kaikki ladattavat moduulit? Etsi jotain, jota ei käytetä, ja sammuta se, tämä säästää muistia.

    Käsittele vähemmän samanaikaisia ​​pyyntöjä

    Miten lisää prosessit Apache saa suorittaa samanaikaisesti, sitä enemmän samanaikaisia ​​pyyntöjä se pystyy käsittelemään. Lisäämällä tätä lukua lisäät siten varatun muistin määrää Apache. Yläosaa käyttämällä näet jokaisen prosessin Apache Se vie hyvin vähän muistia, koska käytetään jaettuja kirjastoja. SISÄÄN Debian 5 Kanssa Apache 2 Oletuskokoonpano on tämä:

    Aloituspalvelimet 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 20 MaxRequestsPer Child 0

    Direktiivi Aloituspalvelimet määrittää palvelinprosessien lukumäärän, jotka käynnistetään aluksi heti käynnistyksen jälkeen. direktiivit MinSpareServers Ja MaxSpareServers määrittää pienin ja enimmäismäärä lapsi "vara" prosesseja Apache. Tällaiset prosessit odottavat saapuvia pyyntöjä, eikä niitä pureta, mikä mahdollistaa palvelimen nopeuttamisen uusiin pyyntöihin. Direktiivi MaxClients määrittää palvelimen samanaikaisesti käsittelemien rinnakkaisten pyyntöjen enimmäismäärän. Kun samanaikaisten yhteyksien määrä ylittää tämän määrän, uudet yhteydet asetetaan käsittelyjonoon. Itse asiassa direktiivi MaxClients ja määrittää lapsiprosessien suurimman sallitun määrän Apache, käynnistettiin samanaikaisesti. Direktiivi MaxRequestsPer Child määrittää pyyntöjen määrän, jotka aliprosessin on käsiteltävä Apache ennen kuin se lopettaa olemassaolonsa. Jos tämän direktiivin arvo on asetettu yhtä kuin nolla, prosessi ei "vanhene".

    Kotipalvelimelleni korjasin kokoonpanon vastaavilla tarpeilla seuraavasti:

    Aloituspalvelimet 1 MinSpareServers 1 MaxSpareServers 1 MaxClients 5 MaxRequestsPer Child 300

    Tietenkin yllä oleva kokoonpano on täysin sopimaton käytettäväksi erittäin kuormitetuilla palvelimilla, mutta kotikäyttöön se on mielestäni aivan oikein.

    Prosessikierto

    Kuten näette, muutin direktiivin arvoa MaxRequestsPer Child. Rajoittamalla aliprosessien elinikää tällä tavalla käsiteltyjen pyyntöjen määrällä voit välttää huonosti kirjoitettujen komentosarjojen aiheuttamat tahattomat muistivuodot.

    Käytä KeepAlivesia, jotka eivät ole liian pitkiä

    Pitää hengissä on tukitapa pysyvä yhteys asiakkaan ja palvelimen välillä. HTTP suunniteltiin alun perin yhteysagnostiseksi. Toisin sanoen kun web-sivu lähetetään asiakkaalle, kaikki sen osat (kuvat, kehykset, JavaScript) siirretään käyttämällä erilaisia, erikseen muodostettuja yhteyksiä. Adventin kanssa Pitää hengissä, selaimilla on nyt mahdollisuus pyytää pysyvä yhteys ja kun se on asennettu, lataa tiedot yhdellä muodostettu yhteys. Tämä menetelmä lisää merkittävästi tuottavuutta. kuitenkin Apache Oletuksena se käyttää liian pitkää aikakatkaisua ennen yhteyden sulkemista, joka vastaa 15 sekuntia. Tämä tarkoittaa, että sen jälkeen, kun kaikki sisältö on toimitettu sitä pyytäneelle asiakkaalle Pitää hengissä, aliprosessi odottaa vielä 15 sekuntia saapuvia pyyntöjä. Se on kuitenkin vähän paljon. On parempi lyhentää tätä aikakatkaisua 2-3 sekuntiin.

    KeepAliveTimeout 2

    Pienennä aikakatkaisua

    Vaihtoehtoisesti voit pienentää direktiivin arvoa Aikalisä, joka määrittää, kuinka kauan kestää odottaa yksittäisten pyyntöjen valmistumista. Oletuksena sen arvo on 300 , ehkä sinun tapauksessasi on järkevää pienentää/lisää tätä arvoa. Itse jätin sen ennalleen.

    Hakkuuintensiteetin vähentäminen

    Palvelimen suorituskyvyn parantamiseksi voit yrittää vähentää kirjaamisen intensiteettiä. Moduulit, kuten mod_rewrite, voi kirjoittaa virheenkorjaustietoja lokiin, ja jos et tarvitse niitä, sammuta sen tulos.

    Isäntänimen resoluution poistaminen käytöstä

    Mielestäni ei ole tarvetta muuttaa IP-osoitteita isäntänimille. Jos tarvitset niitä todella paljon lokien analysoinnissa, voit määrittää ne analyysivaiheessa, etkä palvelimen ollessa käynnissä. Direktiivi on vastuussa isäntänimien selvittämisestä Isäntänimihaut, joka on itse asiassa asennettu oletusarvoisesti sisään Vinossa, mutta tarkista tämä, jos uskot todella, että sinun on poistettava muunnos käytöstä.

    HostnameLookups pois päältä

    .htaccess-tiedoston käyttö estetään

    Tiedostojen käsittely .htaccess suoritettu Apache aina kun pyydät tietoja. Eikä vain se Apache täytyy ladata tämä tiedosto, sen käsittely vie silti paljon aikaa ja resursseja. Tarkastele verkkopalvelintasi ja harkitse tiedostojen tarvetta .htaccess. Jos tarvitset erilaisia ​​asetuksia eri hakemistoille, ehkä olisi realistista laittaa ne pääpalvelimen asetustiedostoon? Ja poista käsittely käytöstä .htaccess mahdollista käskyllä ​​palvelimen kokoonpanossa.