<-
Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.4 > ?e?itli Belgeler

Apache’de Ba?ar?m?n Artt?r?lmas?

Mevcut Diller:  en  |  fr  |  ko  |  tr 

Apache 2.x, esneklik, ta??nabilirlik ve ba?ar?m aras?nda bir denge sa?lamak üzere tasarlanm?? genel ama?l? bir HTTP sunucusudur. Ba?ka sunucularla k?yaslama denemelerinde ?ne ge?mek üzere tasarlanmam?? olsa da Apache 2.x ger?ek ya?amda kar??la??lan pek ?ok durumda olduk?a yüksek bir ba?ar?ma ula?acak yetenektedir.

Apache 1.3 ile kar??la?t?r?ld???nda 2.x sürümleri toplam veri h?z?n? ve ?l?eklenebilirli?i artt?rmak i?in pek ?ok en iyileme se?ene?i i?erir. Bu iyile?tirmelerin pek ?o?u zaten ?ntan?ml? olarak etkin olmakla birlikte derleme ve kullan?m s?ras?nda ba?ar?m? ?nemli ?l?üde etkileyebilen yap?land?rma se?enekleri de mevcuttur. Bu belgede, bir Apache 2.x kurulumunda sunucu y?neticisinin sunucunun ba?ar?m?n? artt?rmak amac?yla yap?land?rma s?ras?nda neler yapabilece?inden bahsedilmi?tir. Bu yap?land?rma se?eneklerinden baz?lar?, httpd’nin donan?m?n ve i?letim sisteminin olanaklar?ndan daha iyi yararlanabilmesini sa?larken bir k?sm? da daha h?zl? bir sunum i?in y?neticinin i?levsellikten ?dün verebilmesini olanakl? k?lar.

Support Apache!

Ayr?ca bak?n?z:

top

Donan?m ve ??letim Sistemi ile ?lgili Konular

HTTP sunucusunun ba?ar?m?n? etkileyen en ?nemli donan?m bellektir (RAM). Bir HTTP sunucusu asla takaslama yapmamal?d?r. ?ünkü takaslama, kullan?c?n?n "yeterince h?z" umdu?u noktada sunumun gecikmesine sebep olur. B?yle bir durumda kullan?c?lar yüklemeyi durdurup tekrar ba?latma e?ilimindedirler; sonu?ta yük daha da artar. MaxRequestWorkers y?nergesinin de?erini de?i?tirerek takaslamaya sebep olabilecek kadar ?ok ?ocuk süre? olu?turulmas?n? engelleyebilirsiniz ve b?yle bir durumda bunu mutlaka yapmal?s?n?z. Bunun i?in yapaca??n?z i?lem basittir: top benzeri bir ara? üzerinden ?al??an süre?lerinizin bir listesini al?p Apache süre?lerinizin ortalama büyüklü?ünü saptay?p, mevcut bellekten bir k?sm?n? di?er süre?ler i?in ay?rd?ktan sonra kalan miktar? bu de?ere b?lerseniz y?nergeye atayaca??n?z de?eri bulmu? olursunuz.

Donan?m?n di?er unsurlar? i?in karar? siz verin: Daha h?zl? i?lemci, daha h?zl? a? kart?, daha h?zl? disk; daha h?zl?n?n ne kadar h?zl? olaca??n? deneyimlerinize ba?l? olarak tamamen sizin ihtiya?lar?n?z belirler.

??letim sistemi se?imi büyük oranda yerel ilgi konusudur. Fakat yine de, genelde yararl?l??? kan?tlanm?? baz? kurallar bu se?imde size yard?mc? olabilir:

top

?al??ma An? Yap?land?rmas? ile ?lgili Konular

HostnameLookups ve DNS ile ilgili di?er konular

Apache 1.3 ?ncesinde, HostnameLookups y?nergesinin ?ntan?ml? de?eri On idi. ?stek yerine getirilmeden ?nce bir DNS sorgusu yap?lmas?n? gerektirmesi sebebiyle bu ayarlama her istekte bir miktar gecikmeye sebep olurdu. Apache 1.3’ten itibaren y?nergenin ?ntan?ml? de?eri Off yap?lm??t?r. E?er günlük dosyalar?n?zda konak isimlerinin bulunmas?n? isterseniz, Apache ile birlikte gelen logresolve program?n? kullanabilece?iniz gibi günlük raporlar?n? ??zümleyen Apache ile gelmeyen programlardan herhangi birini de kullanabilirsiniz.

Günlük dosyalar? üzerindeki bu i?lemi sunucu makinesi d???nda günlük dosyas?n?n bir kopyas? üzerinde yapman?z? ?neririz. Aksi takdirde sunucunuzun ba?ar?m? ?nemli ?l?üde etkilenebilir.

Allow veya Deny y?nergelerinde IP adresi yerine bir konak veya alan ismi belirtirseniz, iki DNS sorguluk bir bedel ?dersiniz (biri normal, di?eri IP taklidine kar?? ters DNS sorgusu). Ba?ar?m? en iyilemek i?in bu y?nergelerde mümkün oldu?unca isim yerine IP adreslerini kullan?n?z.

HostnameLookups y?nergelerinin <Location "/server-status"> gibi b?lüm y?nergelerinin i?inde de yer alabilece?ini unutmay?n. Bu gibi durumlarda DNS sorgular? sadece istek kuralla e?le?ti?i takdirde yap?lacakt?r. A?a??daki ?rnekte .html ve .cgi dosyalar?na yap?lan istekler hari? DNS sorgular? iptal edilmektedir:

HostnameLookups off
<Files ~ "\.(html|cgi)$">
  HostnameLookups on
</Files>

Yine de baz? CGI’lerin DNS isimlerine ihtiyac? olursa bu CGI’lerin bu ihtiya?lar?na y?nelik olarak gethostbyname ?a?r?lar? yapabilece?ini g?zard? etmeyiniz.

FollowSymLinks ve SymLinksIfOwnerMatch

URL uzay?n?zda ge?erli olmak üzere bir Options FollowSymLinks yoksa veya Options SymLinksIfOwnerMatch y?nergeleri varsa, Apache her sembolik ba??n üzerinde baz? s?namalar yapmak i?in ek bir sistem ?a?r?s?ndan ba?ka istenen her dosya i?in de ayr? bir ?a?r? yapacakt?r.

DocumentRoot "/siteler/htdocs"
<Directory />
  Options SymLinksIfOwnerMatch
</Directory>

Bu durumda /index.html i?in bir istek yap?ld???nda Apache, /siteler, /siteler/htdocs ve
/siteler/htdocs/index.html üzerinde lstat(2) ?a?r?lar? yapacakt?r. lstat sonu?lar? ?nbelle?e kaydedilmedi?inden bu i?lem her istekte yinelenecektir. Amac?n?z ger?ekten sembolik ba?lar? güvenlik a??s?ndan s?namaksa bunu ??yle yapabilirsiniz:

DocumentRoot "/siteler/htdocs"
<Directory "/">
  Options FollowSymLinks
</Directory>

<Directory "/siteler/htdocs">
  Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>

B?ylece DocumentRoot alt?ndaki dosyalar i?in fazladan bir ?a?r? yap?lmas?n? engellemi? olursunuz. E?er baz? b?lümlerde Alias, RewriteRule gibi y?nergeler üzerinden belge k?k dizininizin d???nda kalan dosya yollar?na sahipseniz benzer i?lemleri onlar i?in de yapmal?s?n?z. Sembolik ba? korumas? yapmamak suretiyle ba?ar?m? artt?rmak isterseniz, FollowSymLinks se?ene?ini her yerde etkin k?l?n ve SymLinksIfOwnerMatch se?ene?ini asla etkinle?tirmeyin.

AllowOverride

Genellikle .htaccess dosyalar? üzerinden yap?ld??? gibi URL uzay?n?zda ge?ersizle?tirmelere izin veriyorsan?z, Apache her dosya bile?eni i?in bu .htaccess dosyalar?n? a?maya ?al??acakt?r.

DocumentRoot "/siteler/htdocs"
<Directory "/">
  AllowOverride all
</Directory>

Bu durumda /index.html sayfas?na yap?lan bir istek i?in Apache, /.htaccess, /siteler/.htaccess ve /siteler/htdocs/.htaccess dosyalar?n? a?maya ?al??acakt?r. ??züm Options FollowSymLinks durumunun benzeridir; ba?ar?m? artt?rmak i?in dosya sisteminizin her yerinde AllowOverride None olsun.

Dil Uzla??m?

Ba?ar?m? son k?r?nt?s?na kadar artt?rmak istiyorsan?z, mümkünse i?erik dili uzla??m? da yapmay?n. Dil uzla??m?ndan yararlanmak isterken büyük ba?ar?m kay?plar?na u?rayabilirsiniz. B?yle bir durumda sunucunun ba?ar?m?n? artt?rman?n tek bir yolu vard?r.

DirectoryIndex index

Yukar?daki gibi bir dosya ismi kal?b? kullanmak yerine, a?a??daki gibi se?enekleri tam bir liste halinde belirtin:

DirectoryIndex index.cgi index.pl index.shtml index.html

Buradaki s?ralama ?ncelik s?ras?n? belirler; yani, ?ncelikli olmas?n? istedi?iniz se?ene?i listenin ba??na yazmal?s?n?z.

?stenen dosya i?in MultiViews kullanarak dizini taratmak yerine, gerekli bilgiyi tek bir dosyadan okutmak suretiyle ba?ar?m? artt?rabilirsiniz. Bu ama?la türe?lem (type-map) dosyalar? kullanman?z yeterli olacakt?r.

Sitenizde i?erik dili uzla??m?na gerek varsa, bunu Options MultiViews y?nergesi üzerinden de?il, türe?lem dosyalar? kullanarak yapmay? deneyin. ??erik dili uzla??m? ve türe?lem dosyalar?n?n olu?turulmas? hakk?nda daha ayr?nt?l? bilgi edinmek i?in ??erik Uzla??m? belgesine bak?n?z.

Bellek E?lemleri

Apache’nin SSI sayfalar?nda oldu?u gibi teslim edilecek dosyan?n i?eri?ine bakma gere?i duydu?u durumlarda, e?er i?letim sistemi mmap(2) ve benzerlerini destekliyorsa ?ekirdek normal olarak dosyay? belle?e kopyalayacakt?r.

Baz? platformlarda bu belle?e e?leme i?lemi ba?ar?m? artt?rsa da ba?ar?m?n veya httpd kararl?l???n?n zora girdi?i durumlar olabilmektedir:

B?yle durumlar?n olas?l?k dahilinde oldu?u kurulumlarda i?eri?i sunucu taraf?ndan i?lenecek dosyalar?n belle?e kopyalanmamas? i?in yap?land?rman?za EnableMMAP off sat?r?n? ekleyiniz. (Dikkat: Bu y?nerge dizin seviyesinde ge?ersizle?tirilebilen y?nergelerdendir.)

sendfile

Apache’nin duruk dosyalarda oldu?u gibi teslim edilecek dosyan?n i?eri?ine bakmad??? durumlarda, e?er i?letim sistemi sendfile(2) deste?ine sahipse ?ekirdek normal olarak bu deste?i kullanacakt?r.

Baz? platformlarda sendfile kullan?m?, okuma ve yazma i?lemlerinin ayr? ayr? yap?lmamas?n? sa?lasa da sendfile kullan?m?n?n httpd kararl?l???n? bozdu?u baz? durumlar s?zkonusudur:

B?yle durumlar?n olas?l?k dahilinde oldu?u kurulumlarda i?eri?in sendfile deste?iyle teslim edilmemesi i?in yap?land?rman?za EnableSendfile off sat?r?n? ekleyiniz. (Dikkat: Bu y?nerge dizin seviyesinde ge?ersizle?tirilebilen y?nergelerdendir.)

Süre? Olu?turma

Apache 1.3 ?ncesinde MinSpareServers, MaxSpareServers ve StartServers ayarlar?, ba?ka sunucularla k?yaslama denemelerinde ola?anüstü k?tü sonu?lar al?nmas?na sebep olmaktayd?. ?zellikle uygulanan yükü kar??lamaya yetecek say?da ?ocuk süre? olu?turulmas? a?amas?nda Apache’nin elde etti?i ivme bunlardan biriydi. Ba?lang??ta StartServers y?nergesiyle belli say?da süre? olu?turulduktan sonra her saniyede bir tane olmak üzere MinSpareServers say?da ?ocuk süre? olu?turulmaktayd?. ?rne?in, ayn? anda 100 iste?e yan?t vermek i?in StartServers y?nergesinin ?ntan?ml? de?eri olarak ba?ta 5 süre? olu?turuldu?undan kalan süre?ler i?in 95 saniye ge?mesi gerekirdi. S?k s?k yeniden ba?lat?lmad?klar?ndan dolay? ger?ek hayatta sunucular?n ba??na gelen de buydu. Ba?ka sunucularla k?yaslama denemelerinde ise i?lem sadece on dakika sürmekte ve i?ler ac?s? sonu?lar al?nmaktayd?.

Saniyede bir kural?, sunucunun yeni ?ocuklar? olu?turmas? s?ras?nda sistemin a??r? me?gul duruma dü?memesi i?in al?nm?? bir ?nlemdi. Makine ?ocuk süre? olu?turmakla me?gul edildi?i sürece isteklere yan?t veremeyecektir. B?ylesi bir durum Apache’nin ba?ar?m?n? k?tüle?tirmekten ba?ka i?e yaramayacakt?r. Apache 1.3’te saniyede bir kural? biraz esnetildi. Yeni ger?eklenimde art?k bir süre? olu?turduktan bir saniye sonra iki süre?, bir saniye sonra d?rt süre? olu?turulmakta ve i?lem, saniyede 32 ?ocuk süre? olu?turulur duruma gelene kadar b?yle ivmelenmektedir. ?ocuk süre? olu?turma i?lemi MinSpareServers de?erine ula??l?nca durmaktad?r.

Bu, MinSpareServers, MaxSpareServers ve StartServers ayarlar?yla oynamay? neredeyse gereksiz k?lacak kadar iyi sonu?lar verecek gibi g?rünmektedir. Saniyede 4 ?ocuktan fazlas? olu?turulmaya ba?land???nda hata günlü?üne baz? iletiler dü?meye ba?lar. Bu iletilerin say?s? ?ok artarsa bu ayarlarla oynama vakti gelmi? demektir. Bunun i?in mod_status ??kt?s?n? bir k?lavuz olarak kullanabilirsiniz.

Süre? olu?turmayla ilgili olarak süre? ?lümü MaxConnectionsPerChild de?eri ile sa?lan?r. Bu de?er ?ntan?ml? olarak 0 olup, ?ocuk süre? ba??na istek say?s?n?n s?n?rs?z oldu?u anlam?na gelir. E?er yap?land?rman?zda bu de?eri 30 gibi ?ok dü?ük bir de?ere ayarlarsan?z bunu hemen kald?rmak zorunda kalabilirsiniz. Sunucunuzu SunOS veya Solaris’in eski bir sürümü üzerinde ?al??t?r?yorsan?z bellek ka?aklar?na sebep olmamak i?in bu de?eri 10000 ile s?n?rlay?n?z.

Kal?c? ba?lant? ?zelli?ini kullan?yorsan?z, ?ocuk süre?ler zaten a??k ba?lant?lardan istek beklemekte olacaklard?r. KeepAliveTimeout y?nergesinin ?ntan?ml? de?eri 5 saniye olup bu etkiyi en aza indirmeye y?nelik süredir. Burada a? band geni?li?i ile sunucu kaynaklar?n?n kullan?m? aras?nda bir se?im yapmak s?z konusudur. Hi?bir ?ey umurunuzda de?ilse ?o?u ayr?cal???n yitirilmesi pahas?na bu de?eri rahat?a 60 saniyenin üzerine ??karabilirsiniz.

top

Derleme S?ras?nda Yap?land?rma ile ?lgili Konular

MPM Se?imi

Apache 2.x, ?ok Süre?lilik Modülleri (MPM) ad? verilen eklemlenebilir ?ok g?revlilik modellerini destekler. Apache’yi derlerken bu MPM’lerden birini se?meniz gerekir. MPM’lerden baz?lar? platformlara ?zeldir: mpm_netware, mpmt_os2 ve mpm_winnt. Unix benzeri sistemler i?in ise se?ebilece?iniz modül say?s? birden fazlad?r. MPM se?iminin httpd’nin h?z?nda ve ?l?eklenebilirli?inde baz? etkileri olabilir:

Bu modüller ve di?erleri hakk?nda daha ayr?nt?l? bilgi edinmek i?in ?ok Süre?lilik Modülleri belgesine bak?n?z.

Modüller

Bellek kullan?m? ba?ar?m konusunda ?nemli oldu?undan ger?ekte kullanmad???n?z modülleri elemeye ?al??mal?s?n?z. Modülleri birer DSO olarak derlediyseniz LoadModule y?nergesinin bulundu?u sat?r? a??klama haline getirmeniz modülden kurtulman?z i?in yeterli olacakt?r. Modülleri bu ?ekilde kald?rarak onlar?n yoklu?unda sitenizin hala i?levlerini yerine getirdi?ini g?rme ?ans?na da kavu?mu? olursunuz.

Ancak, e?er modülleri Apache ?al??t?r?labilirinin i?ine g?mmü?seniz istenmeyen modülleri kald?rmak i?in Apache'yi yeniden derlemeniz gerekir.

Bu noktada bir soru akla gelebilir: Hangi modüller gerekli, hangileri de?il? Bu sorunun yan?t? ?üphesiz siteden siteye de?i?ir. Ancak, olmazsa olmaz moüller olarak mod_mime, mod_dir ve mod_log_config modüllerini sayabiliriz. Bunlardan mod_log_config olmadan da bir sitenin ?al??abilece?inden hareketle bu modülün varl??? iste?e ba?l? olsa da bu modülü kald?rman?z? ?nermiyoruz.

Atomik ??lemler

Worker MPM'nin en son geli?tirme sürümleri ve mod_cache gibi baz? modüller APR'nin atomik API'sini kullan?rlar. Bu API, dü?ük ayarl? evre e?zamanlamas?nda atomik i?lemler yapar.

?ntan?ml? olarak, APR bu i?lemleri hedef i?letim sistemi/i?lemci platformunda kullan?labilecek en verimli mekanizmay? kullanarak ger?ekle?tirir. Günümüz i?lemcilerinin ?o?u, ?rne?in, bir atomik kar??la?t?rma ve takas (CAS) i?lemini donan?mda ger?ekle?tirmektedir. Baz? platformlarda APR'nin atomik i?lemler i?in ?ntan?ml? olarak daha yava? olan mutekslere dayal? ger?eklenimi kullanmas?n?n sebebi eski i?lemcilerde bu tür makine kodlar?n?n yoklu?udur. Apache'yi bu tür platformalarda günümüz i?lemcileriyde ?al??t?rmay? dü?ünüyorsan?z Apache'yi derlemek i?in yap?land?r?rken en h?zl? atomik i?lemin se?ilebilmesi i?in --enable-nonportable-atomics se?ene?ini kullan?n:

./buildconf
./configure --with-mpm=worker --enable-nonportable-atomics=yes

--enable-nonportable-atomics se?ene?i ?u platformlar i?in uygundur:

mod_status ve ExtendedStatus On

mod_status modülünü derlemi? ve Apache'yi yap?land?r?r ve ?al??t?r?rken ExtendedStatus On sat?r?n? da kullanm??san?z Apache her istek üzerinde gettimeofday(2) (veya i?letim sistemine ba?l? olarak time(2)) ?a?r?s?ndan ba?ka (1.3 ?ncesinde) fazladan defalarca time(2) ?a?r?lar? yapacakt?r. Bu ?a?r?larla durum raporununun zamanlama bilgilerini i?ermesi sa?lan?r. Ba?ar?m? artt?rmak i?in ExtendedStatus off yap?n (zaten ?ntan?ml? b?yledir).

accept dizgilemesi ve ?ok soketli i?lem

Uyar?:

Bu b?lüm, Apache HTTP sunucusunun 2.x sürümlerinde yap?lan de?i?ikliklere g?re tamamen güncellenmemi?tir. Baz? bilgiler hala ge?erliyse de lütfen dikkatli kullan?n?z.

Burada Unix soket arayüzü ger?eklenirken ihmal edilen bir durumdan bahsedece?iz. HTTP sunucunuzun ?ok say?da adresten ?ok say?da portu dinlemek i?in ?ok say?da Listen y?nergesi kullanmakta oldu?unu varsayal?m. Her soketi ?al??t???n? g?rmek i?in denerken Apache ba?lant? i?in select(2) kullanacakt?r. select(2) ?a?r?s? bu soketin üzerinde s?f?r veya en az?ndan bir ba?lant?n?n beklemekte oldu?u anlam?na gelir. Apache'nin modeli ?ok say?da ?ocuk süre? i?erir ve bo?ta olanlar?n tümünde ayn? anda yeni ba?lant?lar denenebilir. Ger?ekte ?al??an kod bu olmasa da meram?m?z? anlatmak i?in kodun ??yle bir ?ey oldu?unu varsayabiliriz:

        for (;;) {
          for (;;) {
            fd_set accept_fds;

            FD_ZERO (&accept_fds);
            for (i = first_socket; i <= last_socket; ++i) {
              FD_SET (i, &accept_fds);
            }
            rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
            if (rc < 1) continue;
            new_connection = -1;
            for (i = first_socket; i <= last_socket; ++i) {
              if (FD_ISSET (i, &accept_fds)) {
                new_connection = accept (i, NULL, NULL);
                if (new_connection != -1) break;
              }
            }
            if (new_connection != -1) break;
          }
          process_the(new_connection);
        }

Bu ?zet ger?eklenim bir tak?m a?l?k sorunlar?na sebep olur. Bu d?ngünün ?al??mas? s?ras?nda ayn? anda ?ok say?da ?ocuk süre? yeniden ?a?r?l?r ve istekler aras?nda kalan ?o?u ?ocuk da select ile engellenir. Engellenen tüm bu ?ocuklar soketlerden herhangi biri üzerinde tek bir istek g?ründü?ünde select taraf?ndan uyand?r?l?p i?leme sokulmak üzere d?ndürülürler. (Uyand?r?lan ?ocuk say?s? i?letim sistemine ve zamanlama ayarlar?na g?re de?i?iklik g?sterir,) Bunlar?n hepsi d?ngüye kat?l?p ba?lant? kabul etmeye (accept) ?al???rlar. Fakat i?lerinden yaln?z biri (sadece bir ba?lant? iste?inin mevcut oldu?u varsay?m?yla) bunu ba?arabilir. Kalan?n?n ba?lant? kabul etmesi (accept) engellenir. Bu durum, bu ?ocuklar? istekleri ba?ka ba?ka soketlerden de?il mecburen tek bir soketten kabul etmeye kilitler ve bu soket üzerinde yeni bir istek belirip uyand?r?lana kadar bu durumda kal?rlar. Bu a?l?k sorunu ilk olarak PR#467 say?l? raporla belgelenmi?tir. Bu sorunun en az iki ??zümü vard?r.

??zümün biri engellenmeyen soket kullan?m?d?r. Bu durumda accept ?ocuklar? engellemeyecek ve yap?lan bir ba?lant?n?n ard?ndan di?er ?ocuklar durumlar? de?i?meksizin ba?lant? beklemeye devam edeceklerdir. Fakat bu durum i?lemci zaman?n?n bo?a harcanmas?na sebep olur. Se?ilmi? (select) bo?ta on ?ocu?un oldu?unu ve bir ba?lant? geldi?ini varsayal?m. Kalan dokuz ?ocuk i?ine devam edip ba?lant? kabul etmeyi (accept) deneyecek, ba?ar?zs?z olacak, d?necek ba?a, tekrar se?ilecek (select) ve b?yle hi?bir i? yapmadan d?nüp duracakt?r. Bu arada hizmet sunmakta olanlar da i?lerini bitirdikten sonra bu d?ngüdeki yerlerini alacaklard?r. Ayn? kutunun i?inde bo?ta bir sürü i?lemciniz (?ok i?lemcili sistemler) yoksa bu ??züm pek verimli olmayacakt?r.

Di?er ??züm ise Apache taraf?ndan kullan?lan ??züm olup, girdiyi bir i? d?ngüde s?raya sokmakt?r. D?ngü a?a??da ?rneklenmi?tir (farklar vurgulanm??t?r):

        for (;;) {
          accept_mutex_on ();
          for (;;) {
            fd_set accept_fds;

            FD_ZERO (&accept_fds);
            for (i = first_socket; i <= last_socket; ++i) {
              FD_SET (i, &accept_fds);
            }
            rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
            if (rc < 1) continue;
            new_connection = -1;
            for (i = first_socket; i <= last_socket; ++i) {
              if (FD_ISSET (i, &accept_fds)) {
                new_connection = accept (i, NULL, NULL);
                if (new_connection != -1) break;
              }
            }
            if (new_connection != -1) break;
          }
          accept_mutex_off ();
          process the new_connection;
        }

accept_mutex_on ve accept_mutex_off i?levleri bir kar??l?kl? red semoforu olu?tururlar. Mutekse ayn? anda sadece bir ?ocuk sahip olabilir. Bu muteksleri ger?eklemek i?in ?e?itli se?enekler vard?r. Se?im, src/conf.h (1.3 ?ncesi) veya src/include/ap_config.h (1.3 ve sonras?) dosyas?nda tan?mlanm??t?r. Baz? mimariler bir kilitleme se?ene?ine sahip de?ildir. B?yle mimarilerde ?ok say?da Listen y?nergesi kullanmak güvenilir olmayacakt?r.

Mutex y?nergesi, mpm-accept muteks ger?eklenimini ?al??ma an?nda de?i?tirmek i?in kullan?labilir. Farkl? muteks ger?eklenimleri ile ilgili hususlar bu y?nergede belgelenmi?tir.

Ba?ka bir ??züm daha vard?r ancak d?ngü k?smen dizgilenmeyece?inden (yani belli say?da sürece izin verilemeyece?inden) asla ger?eklenmemi?tir. Bu sadece, ayn? anda ?ok say?da ?ocuk sürecin ?al??abilece?i ve dolay?s?yla band geni?li?inin tüm y?nleriyle kullan?labilece?i ?ok i?lemcili sistemlerde ilgin? olabilirdi. Bu gelecekte incelenmeye de?er bir konu olmakla beraber ?ok say?da HTTP sunucusunun ayn? anda ayn? amaca hizmet edecek ?ekilde ?al??mas? standart olarak pek mümkün g?rülmedi?inden bu olas?l?k ?ok dü?üktür.

En yüksek ba?ar?m? elde etmek i?in ideal olan? sunucular? ?al??t?r?rken ?ok say?da Listen y?nergesi kullanmamakt?r. Fakat siz yine de okumaya devam edin.

accept dizgilemesi - tek soket

?ok soketli sunucular i?in yukar?da a??klananlar iyi güzel de tek soketli sunucularda durum ne? Kuramsal olarak, bunlar?n hi?biriyle bir sorunlar? olmamas? gerekir. ?ünkü yeni bir ba?lant? gelene kadar tüm ?ocuklar accept(2) ile engellenirler dolay?s?yla hi?bir a?l?k sorununun ortaya ??kmamas? gerekir. Uygulamada ise son kullan?c?dan gizli olarak, yukar?da engellenmeyen ?ocuklar ??zümünde bahsedilenle hemen hemen ayn? "bo?a d?nüp durma" davran??? mevcuttur. ?o?u TCP y???t? bu yolu ger?eklemi?tir. ?ekirdek, yeni bir ba?lant? ortaya ??kt???nda accept ile engellenen tüm süre?leri uyand?r?r. Bu süre?lerden ba?lant?y? alan kullan?c? b?lgesine ge?erken ?ekirdek i?inde d?ngüde olan di?erleri de yeni ba?lant? ke?fedilene kadar uykular?na geri d?nerler. Bu ?ekirdek i?i d?ngü, kullan?c? b?lgesindeki kodlara g?rünür de?ildir ama bu olmad?klar? anlam?na gelmez. Bu durum, ?ok soketli engellenmeyen ?ocuklar ??zümündeki bo?a d?ngünün sebep oldu?u gereksiz i?lemci yükü sorununu i?inde bar?nd?r?r.

Bununla birlikte, tek soketli durumda bile bundan daha verimli bir davran?? sergileyen bir ?ok mimari bulduk. Bu asl?nda hemen hemen her durumda ?ntan?ml? olarak b?yledir. Linux alt?nda yap?lan üstünk?rü denemelerde (128MB bellekli ?ift Pentium pro 166 i?lemcili makinede Linux 2.0.30) tek sokette dizgilemenin dizgilenmemi? duruma g?re saniyede %3 daha az istekle sonu?land??? g?sterilmi?tir. Fakat dizgilenmemi? tek soket durumunda her istekte 100ms'lik ek bir gecikme oldu?u g?rülmü?tür. Bu gecikmenin sebebi muhtemelen uzun mesafeli hatlar olup sadece yerel a?larda s?z konusudur. Tek soketli dizgilemeyi ge?ersiz k?lmak i?in SINGLE_LISTEN_UNSERIALIZED_ACCEPT tan?mlarsan?z tek soketli sunucularda art?k dizgileme yap?lmayacakt?r.

Kapatmay? zamana yaymak

draft-ietf-http-connection-00.txt tasla??n?n 8. b?lümünde bahsedildi?i gibi, bir HTTP sunucusunun protokolü güvenilir ?ekilde ger?eklemesi i?in her iki y?ndeki ileti?imi birbirinden ba??ms?z olarak (iki y?nlü bir TCP ba?lant?s?n?n her yar?s?n? di?erinden ba??ms?z olarak) kapatmas? gerekir.

Bu ?zellik Apache'ye eklendi?inde Unix'in ?e?itli sürümlerinde uzg?rüsüzlükten dolay? bir tak?m ge?ici tela? sorunlar?na sebep oldu. TCP belirtimi FIN_WAIT_2 durumunda bir zaman a??m?ndan bahsetmez ama yasaklamaz da. Zaman a??m? olmayan sistemlerde, Apache 1.2 ?o?u soketin sonsuza kadar FIN_WAIT_2 durumunda tak?l?p kalmas?na sebep olur. ?o?u durumda, sat?c?dan sa?lanan en son TCP/IP yamalar?n? uygulanarak bu ?nlenebilir. Sat?c?n?n hi?bir yeni yama da??tmad??? durumlarda (?rne?in, SunOS4 -- bir kaynak lisans? ile insanlar bunu kendileri yamayabilirse de) bu ?zelli?i devre d??? b?rakmaya karar verdik.

Bunun üstesinden gelmenin iki yolu vard?r. Bunlardan biri SO_LINGER soket se?ene?idir. Bu i?in kaderi buymu? gibi g?rünürse de ?o?u TCP/IP y???t?nda bu gerekti?i gibi ger?eklenmemi?tir. Bu y???tlar üzerinde, bu y?ntemin, do?ru bir ger?eklenimle bile (?rne?in, Linux 2.0.31) sonraki ??zümden daha pahal? oldu?u ortaya ??km??t?r.

?o?unlukla, Apache bunu (http_main.c i?indeki) lingering_close ad?nda bir i?levle ger?ekler. Bu i?lev kabaca ??yle g?rünür:

        void lingering_close (int s)
        {
          char junk_buffer[2048];

          /* shutdown the sending side */
          shutdown (s, 1);

          signal (SIGALRM, lingering_death);
          alarm (30);

          for (;;) {
            select (s for reading, 2 second timeout);
            if (error) break;
            if (s is ready for reading) {
              if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
                break;
              }
              /* just toss away whatever is here */
            }
          }

          close (s);
        }

Ba?lant? sonunda bu do?al olarak biraz daha masrafa yol a?ar, fakat güvenilir bir ger?eklenim i?in bu gereklidir. HTTP/1.1'in daha yayg?n kullan?lmaya ba?lanmas? ve tüm ba?lant?lar?n kal?c? hale gelmesiyle bu ger?eklenim daha fazla istek üzerinden kendi masraf?n? kar??layacakt?r. Ate?le oynamak ve bu ?zelli?i devre d??? b?rakmak isterseniz NO_LINGCLOSE'u tan?mlayabilirsiniz, fakat bu asla ?nerilmez. ?zellikle, HTTP/1.1'den itibaren boruhatl? kal?c? ba?lant?lar?n lingering_close kullanmaya ba?lamas? mutlak bir gerekliliktir (ve boruhatl? ba?lant?lar?n daha h?zl? olmas? nedeniyle bu ba?lant?lar? desteklemek isteyebilirsiniz).

?etele Dosyas?

Apache'nin ana ve alt süre?leri birbirleriyle ?etele denen bir?ey üzerinden haberle?irler. Bunun en mükemmel ?ekilde payla??ml? bellekte ger?eklenmesi gerekir. Eri?ti?imiz veya portlar?n? ayr?nt?l? olarak belirtti?imiz i?letim sistemleri i?in bu, genellikle payla??ml? bellek kullan?larak ger?eklenir. Geri kalanlar, ?ntan?ml? olarak bunu bir disk dosyas? kullanarak ger?ekler. Bir disk dosya? yava? olman?n yan? s?ra güvenilir de de?ildir (ve daha az ?zelli?e sahiptir). Mimarinizin src/main/conf.h dosyas?n? inceleyin ve USE_MMAP_SCOREBOARD veya USE_SHMGET_SCOREBOARD'a bak?n. Bu ikisinden birinin (ve yan? s?ra s?ras?yla HAVE_MMAP veya HAVE_SHMGET'in) tan?mlanm?? olmas?, sa?lanan payla??ml? bellek kodunu etkinle?tirir. E?er sisteminiz di?er türdeki payla??ml? belle?e sahipse, src/main/http_main.c dosyas?n? a??p, Apache'de bu belle?i kullanmas? gereken kanca i?levleri ekleyin (Bize de bir yama yollay?n, lütfen).

Tarihsel bilgi: Apache'nin Linux uyarlamas?, Apache'nin 1.2 sürümüne kadar payla??ml? belle?i kullanmaya ba?lamam??t?. Bu kusur, Apache'nin Linux üzerindeki erken d?nem sürümlerinin davran??lar?n?n zay?f ve güvenilmez olmas?na yol a?m??t?.

DYNAMIC_MODULE_LIMIT

Devingen olarak yüklenen modülleri kullanmamak niyetindeyseniz (buray? okuyan ve sunucunuzun ba?ar?m?n? son k?r?nt?s?na kadar artt?rmakla ilgilenen biriyseniz bunu dü?ünmezsiniz), sunucunuzu derlerken se?enekler aras?na -DDYNAMIC_MODULE_LIMIT=0 se?ene?ini de ekleyin. Bu suretle, sadece, devingen olarak yüklenen modüller i?in ayr?lacak belle?i kazanm?? olacaks?n?z.

top

Ek: Bir ?a?r? izlemesinin ayr?nt?l? ??zümlemesi

Burada, Solaris 8 üzerinde worker MPM'li Apache 2.0.38'in bir sistem ?a?r?s? izlenmektedir. Bu izleme ?u komutla elde edilmi?tir:

truss -l -p httpd_?ocuk_pidi.

-l se?ene?i, truss'a hafif bir sürecin yapt??? her sistem ?a?r?s?n? (hafif süre? -- HS -- Solaris'in bir ?ekirdek seviyesi evreleme bi?imi) günlü?e yazmas?n? s?yler.

Di?er sistemlerin sistem ?a?r?lar?n? izleyen farkl? ara?lar? vard?r (strace, ktrace, par gibi). Bunlar da benzer ??kt?lar üretirler.

Bu izleme s?ras?nda, bir istemci httpd'den 10 KB'l?k duruk bir dosya talebinde bulunmu?tur. Duruk olmayan veya i?erik uzla??ml? isteklerin izleme kay?tlar? vah?ice (baz? durumlarda epey ?irkince) farkl? g?rünür.

/67: accept(3, 0x00200BEC, 0x00200C0C, 1) (uykuda...)
/67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9

Bu izlemede, dinleyen evre HS #67 i?inde ?al??maktad?r.

accept(2) dizgelemesinin olmay???na dikkat edin. ?zellikle bu platformda worker MPM, ?ok say?da portu dinlemedik?e, ?ntan?ml? olarak dizgele?tirilmemi? bir accept ?a?r?s? kullan?r.

/65: lwp_park(0x00000000, 0) = 0
/67: lwp_unpark(65, 1) = 0

Ba?lant?n?n kabul edilmesiyle, dinleyici evre iste?i yerine getirmek üzere bir worker evresini uyand?r?r. Bu izlemede, iste?i yerine getiren worker evresi HS #65'e aittir.

/65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0

Sanal konaklar?n ger?eklenimi s?ras?nda, Apache'nin, ba?lant?lar? kabul etmek i?in kullan?lan yerel soket adreslerini bilmesi gerekir. ?o?u durumda bu ?a?r?y? bertaraf etmek mümkündür (hi? sanal kona??n olmad??? veya Listen y?nergelerinin mutlak adreslerle kullan?ld??? durumlarda). Fakat bu en iyilemeleri yapmak i?in henüz bir ?aba harcanmam??t?r.

/65: brk(0x002170E8) = 0
/65: brk(0x002190E8) = 0

brk(2) ?a?r?lar? devingen bellekten bellek ay?r?r. httpd ?o?u iste?i yerine getirirken ?zel bellek ay?r?c?lar (apr_pool ve apr_bucket_alloc) kulland???ndan bunlar bir sistem ?a?r?s? izlemesinde nadiren g?rünür. Bu izlemede, httpd henüz yeni ba?lat?ld???ndan, ?zel bellek ay?r?c?lar? olu?turmak i?in ham bellek bloklar?n? ay?rmak amac?yla malloc(3) ?a?r?lar? yapmas? gerekir.

/65: fcntl(9, F_GETFL, 0x00000000) = 2
/65: fstat64(9, 0xFAF7B818) = 0
/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0
/65: fstat64(9, 0xFAF7B818) = 0
/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0
/65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0
/65: fcntl(9, F_SETFL, 0x00000082) = 0

Ard?ndan, worker evresi istemciye (dosya tan?t?c?s? 9) engellenmeyen kipte bir ba?lant? a?ar. setsockopt(2) ve getsockopt(2) ?a?r?lar?, Solaris libc'sinin soketler üzerindeki fcntl(2) ?a?r?s? yan?nda birer yan etkiden ibarettirler.

/65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97

Worker evresi istemciden iste?i okur.

/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0
/65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10

Bu httpd Options FollowSymLinks ve AllowOverride None ile yap?land?r?lm??t?r. Bu bak?mdan, ne istenen dosya ile sonu?lanan yol üzerindeki her dizinde lstat(2) ?a?r?s?na ne de .htaccess dosyalar?na bak?lmas?na gerek vard?r. stat(2) ?a?r?s? basit?e dosya i?in ?unlar? do?rulamak amac?yla yap?l?r: 1) dosya mevcuttur ve 2) bir dizin de?il normal bir dosyad?r.

/65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269

Bu ?rnekte, httpd, istenen dosyay? ve HTTP yan?t ba?l???n? tek bir sendfilev(2) sistem ?a?r?s? ile g?ndermektedir. Dosya g?nderim i?leminin anlam? sistemden sisteme de?i?iklik g?sterir. Baz? sistemlerde, sendfile(2) ?a?r?s?ndan ?nce ba?l?klar? g?ndermek i?in write(2) veya writev(2) ?a?r?s? yapmak gerekir.

/65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78

Bu write(2) ?a?r?s? iste?i eri?im günlü?üne kaydeder. Bu izlemede eksik olan tek ?ey, time(2) ?a?r?s?d?r. Apache 1.3'ün aksine, Apache 2.x zamana bakmak i?in gettimeofday(3) ?a??r?s?n? kullan?r. Linux ve Solaris gibi baz? i?letim sistemleri, gettimeofday i?levinin, s?radan bir sistem ?a?r?s?ndan daha fazla g?türüsü olmayan en iyilenmi? bir ger?eklenimine sahiptir.

/65: shutdown(9, 1, 1) = 0
/65: poll(0xFAF7B980, 1, 2000) = 1
/65: read(9, 0xFAF7BC20, 512) = 0
/65: close(9) = 0

Burada worker evresi ba?lant?y? zamana yaymaktad?r.

/65: close(10) = 0
/65: lwp_park(0x00000000, 0) (uykuda...)

Son olarak, worker evresi teslim edilen dosyay? kapatt?ktan sonra dinleyici evre taraf?ndan ba?ka bir ba?lant? atan?ncaya kadar beklemeye al?n?r.

/67: accept(3, 0x001FEB74, 0x001FEB94, 1) (uykuda...)

Bu arada, dinleyici evre ba?lant?y? bir worker evresine atar atamaz ba?ka bir ba?lant?y? beklemeye ba?lar (Mevcut tüm evreler me?gulse dinleyici evreyi bask?layan worker MPM'nin ak?? denetim ?emas?na konu olur). Bu izlemede g?rünmüyor olsa da sonraki accept(2) ?a?r?s?, yeni ba?lant? kabul eden worker evresine paralel olarak yap?labilir (a??r? yük durumlar?nda normal olarak, bu yap?l?r).

Mevcut Diller:  en  |  fr  |  ko  |  tr 

top

Yorum

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.
白小姐透特期期