1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml" lang="tr" xml:lang="tr"><head><!-- 4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5 This file is generated from xml source: DO NOT EDIT 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 7 --> 8<title>Apache’de Başarımın Arttırılması - Apache HTTP Sunucusu</title> 9<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> 10<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> 11<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" /> 12<script src="/style/scripts/prettify.min.js" type="text/javascript"> 13</script> 14 15<link href="/images/favicon.ico" rel="shortcut icon" /></head> 16<body id="manual-page"><div id="page-header"> 17<p class="menu"><a href="/mod/">Modüller</a> | <a href="/mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="/glossary.html">Terimler</a> | <a href="/sitemap.html">Site Haritası</a></p> 18<p class="apache">Apache HTTP Sunucusu Sürüm 2.4</p> 19<img alt="" src="/images/feather.gif" /></div> 20<div class="up"><a href="./"><img title="<-" alt="<-" src="/images/left.gif" /></a></div> 21<div id="path"> 22<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Sunucusu</a> > <a href="http://httpd.apache.org/docs/">Belgeleme</a> > <a href="../">Sürüm 2.4</a> > <a href="./">Çeşitli Belgeler</a></div><div id="page-content"><div id="preamble"><h1>Apache’de Başarımın Arttırılması</h1> 23<div class="toplang"> 24<p><span>Mevcut Diller: </span><a href="/en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English"> en </a> | 25<a href="/fr/misc/perf-tuning.html" hreflang="fr" rel="alternate" title="Français"> fr </a> | 26<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | 27<a href="/tr/misc/perf-tuning.html" title="Türkçe"> tr </a></p> 28</div> 29 30 31 <p>Apache 2.x, esneklik, taşınabilirlik ve başarım arasında bir denge 32 sağlamak üzere tasarlanmış genel amaçlı bir HTTP sunucusudur. Başka 33 sunucularla kıyaslama denemelerinde öne geçmek üzere tasarlanmamış 34 olsa da Apache 2.x gerçek yaşamda karşılaşılan pek çok durumda oldukça 35 yüksek bir başarıma ulaşacak yetenektedir.</p> 36 37 <p>Apache 1.3 ile karşılaştırıldığında 2.x sürümleri toplam veri hızını 38 ve ölçeklenebilirliği arttırmak için pek çok en iyileme seçeneği 39 içerir. Bu iyileştirmelerin pek çoğu zaten öntanımlı olarak etkin 40 olmakla birlikte derleme ve kullanım sırasında başarımı önemli ölçüde 41 etkileyebilen yapılandırma seçenekleri de mevcuttur. Bu belgede, bir 42 Apache 2.x kurulumunda sunucu yöneticisinin sunucunun başarımını 43 arttırmak amacıyla yapılandırma sırasında neler yapabileceğinden 44 bahsedilmiştir. Bu yapılandırma seçeneklerinden bazıları, httpd’nin 45 donanımın ve işletim sisteminin olanaklarından daha iyi 46 yararlanabilmesini sağlarken bir kısmı da daha hızlı bir sunum için 47 yöneticinin işlevsellikten ödün verebilmesini olanaklı kılar.</p> 48 49 </div> 50<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#hardware">Donanım ve İşletim Sistemi ile İlgili Konular</a></li> 51<li><img alt="" src="/images/down.gif" /> <a href="#runtime">Çalışma Anı Yapılandırması ile İlgili Konular</a></li> 52<li><img alt="" src="/images/down.gif" /> <a href="#compiletime">Derleme Sırasında Yapılandırma ile İlgili Konular</a></li> 53<li><img alt="" src="/images/down.gif" /> <a href="#trace">Ek: Bir çağrı izlemesinin ayrıntılı çözümlemesi</a></li> 54</ul><ul class="seealso"><li><a href="#comments_section">Yorum</a></li></ul></div> 55<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 56<div class="section"> 57<h2><a name="hardware" id="hardware">Donanım ve İşletim Sistemi ile İlgili Konular</a></h2> 58 59 60 61 <p>HTTP sunucusunun başarımını etkileyen en önemli donanım bellektir 62 (RAM). Bir HTTP sunucusu asla takaslama yapmamalıdır. Çünkü takaslama, 63 kullanıcının "yeterince hız" umduğu noktada sunumun gecikmesine sebep 64 olur. Böyle bir durumda kullanıcılar yüklemeyi durdurup tekrar 65 başlatma eğilimindedirler; sonuçta yük daha da artar. <code class="directive"><a href="/mod/mpm_common.html#maxrequestworkers">MaxRequestWorkers</a></code> yönergesinin değerini 66 değiştirerek takaslamaya sebep olabilecek kadar çok çocuk süreç 67 oluşturulmasını engelleyebilirsiniz ve böyle bir durumda bunu mutlaka 68 yapmalısınız. Bunun için yapacağınız işlem basittir: <code>top</code> 69 benzeri bir araç üzerinden çalışan süreçlerinizin bir listesini alıp 70 Apache süreçlerinizin ortalama büyüklüğünü saptayıp, mevcut bellekten 71 bir kısmını diğer süreçler için ayırdıktan sonra kalan miktarı bu 72 değere bölerseniz yönergeye atayacağınız değeri bulmuş olursunuz.</p> 73 74 <p>Donanımın diğer unsurları için kararı siz verin: Daha hızlı işlemci, 75 daha hızlı ağ kartı, daha hızlı disk; daha hızlının ne kadar hızlı 76 olacağını deneyimlerinize bağlı olarak tamamen sizin ihtiyaçlarınız 77 belirler.</p> 78 79 <p>İşletim sistemi seçimi büyük oranda yerel ilgi konusudur. Fakat yine 80 de, genelde yararlılığı kanıtlanmış bazı kurallar bu seçimde size 81 yardımcı olabilir:</p> 82 83 <ul> 84 <li> 85 <p>Seçtiğiniz işletim sisteminin (çekirdeğin) en son kararlı 86 sürümünü çalıştırın. Bir çok işletim sistemi, son yıllarda TCP 87 yığıtları ve evre kütüphaneleri ile ilgili belirgin iyileştirmeler 88 yapmışlar ve yapmaktadırlar.</p> 89 </li> 90 91 <li> 92 <p>İşletim sisteminiz <code>sendfile</code>(2) sistem çağrısını 93 destekliyorsa bunun etkinleştirilebildiği sürümün kurulu olması 94 önemlidir. (Örneğin, Linux için bu, Linux 2.4 ve sonraki sürümler 95 anlamına gelirken, Solaris için Solaris 8’den önceki sürümlerin 96 yamanması gerektirdiği anlamına gelmektedir.) 97 <code>sendfile</code> işlevinin desteklendiği sistemlerde Apache 2 98 duruk içeriği daha hızlı teslim etmek ve işlemci kullanımını 99 düşürmek amacıyla bu işlevselliği kullanacaktır.</p> 100 </li> 101 </ul> 102 103 </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 104<div class="section"> 105<h2><a name="runtime" id="runtime">Çalışma Anı Yapılandırması ile İlgili Konular</a></h2> 106 107 108 109 <table class="related"><tr><th>İlgili Modüller</th><th>İlgili Yönergeler</th></tr><tr><td><ul><li><code class="module"><a href="/mod/mod_dir.html">mod_dir</a></code></li><li><code class="module"><a href="/mod/mpm_common.html">mpm_common</a></code></li><li><code class="module"><a href="/mod/mod_status.html">mod_status</a></code></li></ul></td><td><ul><li><code class="directive"><a href="/mod/core.html#allowoverride">AllowOverride</a></code></li><li><code class="directive"><a href="/mod/mod_dir.html#directoryindex">DirectoryIndex</a></code></li><li><code class="directive"><a href="/mod/core.html#hostnamelookups">HostnameLookups</a></code></li><li><code class="directive"><a href="/mod/core.html#enablemmap">EnableMMAP</a></code></li><li><code class="directive"><a href="/mod/core.html#enablesendfile">EnableSendfile</a></code></li><li><code class="directive"><a href="/mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code></li><li><code class="directive"><a href="/mod/prefork.html#maxspareservers">MaxSpareServers</a></code></li><li><code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code></li><li><code class="directive"><a href="/mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code></li></ul></td></tr></table> 110 111 <h3><a name="dns" id="dns"><code>HostnameLookups</code> ve DNS ile ilgili diğer konular</a></h3> 112 113 114 115 <p>Apache 1.3 öncesinde, <code class="directive"><a href="/mod/core.html#hostnamelookups">HostnameLookups</a></code> yönergesinin öntanımlı değeri 116 <code>On</code> idi. İstek yerine getirilmeden önce bir DNS sorgusu 117 yapılmasını gerektirmesi sebebiyle bu ayarlama her istekte bir 118 miktar gecikmeye sebep olurdu. Apache 1.3’ten itibaren yönergenin 119 öntanımlı değeri <code>Off</code> yapılmıştır. Eğer günlük 120 dosyalarınızda konak isimlerinin bulunmasını isterseniz, Apache ile 121 birlikte gelen <code class="program"><a href="/programs/logresolve.html">logresolve</a></code> programını 122 kullanabileceğiniz gibi günlük raporlarını çözümleyen Apache ile 123 gelmeyen programlardan herhangi birini de kullanabilirsiniz.</p> 124 125 <p>Günlük dosyaları üzerindeki bu işlemi sunucu makinesi dışında 126 günlük dosyasının bir kopyası üzerinde yapmanızı öneririz. Aksi 127 takdirde sunucunuzun başarımı önemli ölçüde etkilenebilir.</p> 128 129 <p><code class="directive"><a href="/mod/mod_access_compat.html#allow">Allow</a></code> veya 130 <code class="directive"><a href="/mod/mod_access_compat.html#deny">Deny</a></code> 131 yönergelerinde IP adresi yerine bir konak veya alan ismi 132 belirtirseniz, iki DNS sorguluk bir bedel ödersiniz (biri normal, 133 diğeri IP taklidine karşı ters DNS sorgusu). Başarımı en iyilemek 134 için bu yönergelerde mümkün olduğunca isim yerine IP adreslerini 135 kullanınız.</p> 136 137 <p><code class="directive"><a href="/mod/core.html#hostnamelookups">HostnameLookups</a></code> 138 yönergelerinin <code><Location /server-status></code> gibi 139 bölüm yönergelerinin içinde de yer alabileceğini unutmayın. Bu gibi 140 durumlarda DNS sorguları sadece istek kuralla eşleştiği takdirde 141 yapılacaktır. Aşağıdaki örnekte <code>.html</code> ve 142 <code>.cgi</code> dosyalarına yapılan istekler hariç DNS sorguları 143 iptal edilmektedir:</p> 144 145 <pre class="prettyprint lang-config">HostnameLookups off 146<Files ~ "\.(html|cgi)$"> 147 HostnameLookups on 148</Files></pre> 149 150 151 <p>Yine de bazı CGI’lerin DNS isimlerine ihtiyacı olursa bu CGI’lerin 152 bu ihtiyaçlarına yönelik olarak <code>gethostbyname</code> çağrıları 153 yapabileceğini gözardı etmeyiniz.</p> 154 155 156 157 <h3><a name="symlinks" id="symlinks"><code>FollowSymLinks</code> ve 158 <code>SymLinksIfOwnerMatch</code></a></h3> 159 160 161 162 <p>URL uzayınızda geçerli olmak üzere bir <code>Options 163 FollowSymLinks</code> yoksa veya <code>Options 164 SymLinksIfOwnerMatch</code> yönergeleri varsa, Apache her sembolik 165 bağın üzerinde bazı sınamalar yapmak için ek bir sistem çağrısından 166 başka istenen her dosya için de ayrı bir çağrı yapacaktır.</p> 167 168 <pre class="prettyprint lang-config">DocumentRoot /siteler/htdocs 169<Directory /> 170 Options SymLinksIfOwnerMatch 171</Directory></pre> 172 173 174 <p>Bu durumda <code>/index.html</code> için bir istek yapıldığında 175 Apache, <code>/siteler</code>, <code>/siteler/htdocs</code> ve<br /> 176 <code>/siteler/htdocs/index.html</code> üzerinde 177 <code>lstat</code>(2) çağrıları yapacaktır. <code>lstat</code> 178 sonuçları önbelleğe kaydedilmediğinden bu işlem her istekte 179 yinelenecektir. Amacınız gerçekten sembolik bağları güvenlik 180 açısından sınamaksa bunu şöyle yapabilirsiniz:</p> 181 182 <pre class="prettyprint lang-config">DocumentRoot /siteler/htdocs 183<Directory /> 184 Options FollowSymLinks 185</Directory> 186 187<Directory /siteler/htdocs> 188 Options -FollowSymLinks +SymLinksIfOwnerMatch 189</Directory></pre> 190 191 192 <p>Böylece <code class="directive"><a href="/mod/core.html#documentroot">DocumentRoot</a></code> altındaki 193 dosyalar için fazladan bir çağrı yapılmasını engellemiş olursunuz. 194 Eğer bazı bölümlerde <code class="directive"><a href="/mod/mod_alias.html#alias">Alias</a></code>, <code class="directive"><a href="/mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> gibi yönergeler üzerinden belge kök 195 dizininizin dışında kalan dosya yollarına sahipseniz benzer 196 işlemleri onlar için de yapmalısınız. Sembolik bağ koruması yapmamak 197 suretiyle başarımı arttırmak isterseniz, <code>FollowSymLinks</code> 198 seçeneğini her yerde etkin kılın ve 199 <code>SymLinksIfOwnerMatch</code> seçeneğini asla 200 etkinleştirmeyin.</p> 201 202 203 204 <h3><a name="htaccess" id="htaccess"><code>AllowOverride</code></a></h3> 205 206 207 208 <p>Genellikle <code>.htaccess</code> dosyaları üzerinden yapıldığı 209 gibi URL uzayınızda geçersizleştirmelere izin veriyorsanız, Apache 210 her dosya bileşeni için bu <code>.htaccess</code> dosyalarını açmaya 211 çalışacaktır.</p> 212 213 <pre class="prettyprint lang-config">DocumentRoot /siteler/htdocs 214<Directory /> 215 AllowOverride all 216</Directory></pre> 217 218 219 <p>Bu durumda <code>/index.html</code> sayfasına yapılan bir istek için 220 Apache, <code>/.htaccess</code>, <code>/siteler/.htaccess</code> ve 221 <code>/siteler/htdocs/.htaccess</code> dosyalarını açmaya 222 çalışacaktır. Çözüm <code>Options FollowSymLinks</code> durumunun 223 benzeridir; başarımı arttırmak için dosya sisteminizin her yerinde 224 <code>AllowOverride None</code> olsun.</p> 225 226 227 228 <h3><a name="negotiation" id="negotiation">Dil Uzlaşımı</a></h3> 229 230 231 232 <p>Başarımı son kırıntısına kadar arttırmak istiyorsanız, mümkünse 233 içerik dili uzlaşımı da yapmayın. Dil uzlaşımından yararlanmak 234 isterken büyük başarım kayıplarına uğrayabilirsiniz. Böyle bir 235 durumda sunucunun başarımını arttırmanın tek bir yolu vardır. </p> 236 237 <pre class="prettyprint lang-config">DirectoryIndex index</pre> 238 239 240 <p>Yukarıdaki gibi bir dosya ismi kalıbı kullanmak yerine, aşağıdaki 241 gibi seçenekleri tam bir liste halinde belirtin:</p> 242 243 <pre class="prettyprint lang-config">DirectoryIndex index.cgi index.pl index.shtml index.html</pre> 244 245 246 <p>Buradaki sıralama öncelik sırasını belirler; yani, 247 öncelikli olmasını istediğiniz seçeneği listenin başına 248 yazmalısınız.</p> 249 250 <p>İstenen dosya için <code>MultiViews</code> kullanarak dizini 251 taratmak yerine, gerekli bilgiyi tek bir dosyadan okutmak suretiyle 252 başarımı arttırabilirsiniz. Bu amaçla türeşlem 253 (<code>type-map</code>) dosyaları kullanmanız yeterli olacaktır.</p> 254 255 <p>Sitenizde içerik dili uzlaşımına gerek varsa, bunu <code>Options 256 MultiViews</code> yönergesi üzerinden değil, türeşlem dosyaları 257 kullanarak yapmayı deneyin. İçerik dili uzlaşımı ve türeşlem 258 dosyalarının oluşturulması hakkında daha ayrıntılı bilgi edinmek 259 için <a href="/content-negotiation.html">İçerik Uzlaşımı</a> 260 belgesine bakınız.</p> 261 262 263 264 <h3>Bellek Eşlemleri</h3> 265 266 267 268 <p>Apache’nin SSI sayfalarında olduğu gibi teslim edilecek dosyanın 269 içeriğine bakma gereği duyduğu durumlarda, eğer işletim sistemi 270 <code>mmap</code>(2) ve benzerlerini destekliyorsa çekirdek normal 271 olarak dosyayı belleğe kopyalayacaktır.</p> 272 273 <p>Bazı platformlarda bu belleğe eşleme işlemi başarımı arttırsa da 274 başarımın veya httpd kararlılığının zora girdiği durumlar 275 olabilmektedir:</p> 276 277 <ul> 278 <li> 279 <p>Bazı işletim sistemlerinde işlemci sayısı artışına bağlı 280 olarak, <code>mmap</code> işlevi <code>read</code>(2) kadar iyi 281 ölçeklenmemiştir. Örneğin, çok işlemcili Solaris sunucularda 282 <code>mmap</code> iptal edildiği takdirde içeriği sunucu 283 tarafından işlenen dosyalar üzerinde bazen daha hızlı işlem 284 yapılabilmektedir.</p> 285 </li> 286 287 <li> 288 <p>Belleğe kopyalanacak dosya NFS üzerinden bağlanan bir dosya 289 sistemindeyse ve dosya başka bir NFS istemcisi makine tarafından 290 silinmiş veya dosyanın boyutu değiştirilmişse sunucunuz dosyaya 291 tekrar erişmeye çalıştığında bir hata alabilecektir.</p> 292 </li> 293 </ul> 294 295 <p>Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriği 296 sunucu tarafından işlenecek dosyaların belleğe kopyalanmaması için 297 yapılandırmanıza <code>EnableMMAP off</code> satırını ekleyiniz. 298 (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen 299 yönergelerdendir.)</p> 300 301 302 303 <h3><code>sendfile</code></h3> 304 305 306 307 <p>Apache’nin duruk dosyalarda olduğu gibi teslim edilecek dosyanın 308 içeriğine bakmadığı durumlarda, eğer işletim sistemi 309 <code>sendfile</code>(2) desteğine sahipse çekirdek normal olarak bu 310 desteği kullanacaktır.</p> 311 312 <p>Bazı platformlarda <code>sendfile</code> kullanımı, okuma ve yazma 313 işlemlerinin ayrı ayrı yapılmamasını sağlasa da 314 <code>sendfile</code> kullanımının httpd kararlılığını bozduğu bazı 315 durumlar sözkonusudur:</p> 316 317 <ul> 318 <li> 319 <p>Bazı platformlar derleme sisteminin saptayamadığı bozuk bir 320 <code>sendfile</code> desteğine sahip olabilir. Özellikle 321 derleme işleminin başka bir platformda yapılıp 322 <code>sendfile</code> desteği bozuk bir makineye kurulum 323 yapıldığı durumlarda bu desteğin bozuk olduğu 324 saptanamayacaktır.</p> 325 </li> 326 <li> 327 <p>Çekirdek, NFS üzerinden erişilen ağ dosyalarını kendi önbelleği 328 üzerinden gerektiği gibi sunamayabilir.</p> 329 </li> 330 </ul> 331 332 <p>Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriğin 333 <code>sendfile</code> desteğiyle teslim edilmemesi için 334 yapılandırmanıza <code>EnableSendfile off</code> satırını ekleyiniz. 335 (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen 336 yönergelerdendir.)</p> 337 338 339 340 <h3><a name="process" id="process">Süreç Oluşturma</a></h3> 341 342 343 344 <p>Apache 1.3 öncesinde <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code>, <code class="directive"><a href="/mod/prefork.html#maxspareservers">MaxSpareServers</a></code> ve <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code> ayarları, başka sunucularla kıyaslama 345 denemelerinde olağanüstü kötü sonuçlar alınmasına sebep olmaktaydı. 346 Özellikle uygulanan yükü karşılamaya yetecek sayıda çocuk süreç 347 oluşturulması aşamasında Apache’nin elde ettiği ivme bunlardan 348 biriydi. Başlangıçta <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code> yönergesiyle belli sayıda süreç 349 oluşturulduktan sonra her saniyede bir tane olmak üzere <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code> sayıda çocuk süreç 350 oluşturulmaktaydı. Örneğin, aynı anda 100 isteğe yanıt vermek için 351 <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code> 352 yönergesinin öntanımlı değeri olarak başta <code>5</code> süreç 353 oluşturulduğundan kalan süreçler için 95 saniye geçmesi gerekirdi. 354 Sık sık yeniden başlatılmadıklarından dolayı gerçek hayatta 355 sunucuların başına gelen de buydu. Başka sunucularla kıyaslama 356 denemelerinde ise işlem sadece on dakika sürmekte ve içler acısı 357 sonuçlar alınmaktaydı.</p> 358 359 <p>Saniyede bir kuralı, sunucunun yeni çocukları oluşturması sırasında 360 sistemin aşırı meşgul duruma düşmemesi için alınmış bir önlemdi. 361 Makine çocuk süreç oluşturmakla meşgul edildiği sürece isteklere 362 yanıt veremeyecektir. Böylesi bir durum Apache’nin başarımını 363 kötüleştirmekten başka işe yaramayacaktır. Apache 1.3’te saniyede 364 bir kuralı biraz esnetildi. Yeni gerçeklenimde artık bir süreç 365 oluşturduktan bir saniye sonra iki süreç, bir saniye sonra dört 366 süreç oluşturulmakta ve işlem, saniyede 32 çocuk süreç oluşturulur 367 duruma gelene kadar böyle ivmelenmektedir. Çocuk süreç oluşturma 368 işlemi <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code> 369 değerine ulaşılınca durmaktadır.</p> 370 371 <p>Bu, <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code>, 372 <code class="directive"><a href="/mod/prefork.html#maxspareservers">MaxSpareServers</a></code> ve 373 <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code> ayarlarıyla 374 oynamayı neredeyse gereksiz kılacak kadar iyi sonuçlar verecek gibi 375 görünmektedir. Saniyede 4 çocuktan fazlası oluşturulmaya 376 başlandığında hata günlüğüne bazı iletiler düşmeye başlar. Bu 377 iletilerin sayısı çok artarsa bu ayarlarla oynama vakti gelmiş 378 demektir. Bunun için <code class="module"><a href="/mod/mod_status.html">mod_status</a></code> çıktısını bir 379 kılavuz olarak kullanabilirsiniz.</p> 380 381 <p>Süreç oluşturmayla ilgili olarak süreç ölümü <code class="directive"><a href="/mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code> değeri ile 382 sağlanır. Bu değer öntanımlı olarak <code>0</code> olup, çocuk süreç 383 başına istek sayısının sınırsız olduğu anlamına gelir. Eğer 384 yapılandırmanızda bu değeri <code>30</code> gibi çok düşük bir 385 değere ayarlarsanız bunu hemen kaldırmak zorunda kalabilirsiniz. 386 Sunucunuzu SunOS veya Solaris’in eski bir sürümü üzerinde 387 çalıştırıyorsanız bellek kaçaklarına sebep olmamak için bu değeri 388 <code>10000</code> ile sınırlayınız.</p> 389 390 <p>Kalıcı bağlantı özelliğini kullanıyorsanız, çocuk süreçler zaten 391 açık bağlantılardan istek beklemekte olacaklardır. <code class="directive"><a href="/mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code> yönergesinin öntanımlı 392 değeri <code>5</code> saniye olup bu etkiyi en aza indirmeye yönelik 393 süredir. Burada ağ band genişliği ile sunucu kaynaklarının kullanımı 394 arasında bir seçim yapmak söz konusudur. Hiçbir şey umurunuzda 395 değilse <a href="http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-4.html"> 396 çoğu ayrıcalığın yitirilmesi pahasına</a> bu değeri rahatça 397 <code>60</code> saniyenin üzerine çıkarabilirsiniz.</p> 398 399 400 </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 401<div class="section"> 402<h2><a name="compiletime" id="compiletime">Derleme Sırasında Yapılandırma ile İlgili Konular</a></h2> 403 404 405 <h3>MPM Seçimi</h3> 406 407 408 <p>Apache 2.x, <a href="/mpm.html">Çok Süreçlilik Modülleri</a> 409 (MPM) adı verilen eklemlenebilir çok görevlilik modellerini 410 destekler. Apache’yi derlerken bu MPM’lerden birini seçmeniz 411 gerekir. MPM’lerden bazıları platformlara özeldir: 412 <code class="module"><a href="/mod/mpm_netware.html">mpm_netware</a></code>, <code class="module"><a href="/mod/mpmt_os2.html">mpmt_os2</a></code> ve 413 <code class="module"><a href="/mod/mpm_winnt.html">mpm_winnt</a></code>. Unix 414 benzeri sistemler için ise seçebileceğiniz modül sayısı birden 415 fazladır. MPM seçiminin httpd’nin hızında ve ölçeklenebilirliğinde 416 bazı etkileri olabilir:</p> 417 418 <ul> 419 420 <li><code class="module"><a href="/mod/worker.html">worker</a></code> modülü her biri çok evreli çok sayıda 421 çocuk süreç kullanımını destekler. Her evre aynı anda tek bir 422 bağlantıya hizmet sunar. Aynı hizmeti daha az bellek harcayarak 423 vermesi nedeniyle yüksek trafiğe sahip sunucularda 424 <code class="module"><a href="/mod/prefork.html">prefork</a></code> modülüne göre daha iyi bir seçimdir.</li> 425 426 <li><code class="module"><a href="/mod/event.html">event</a></code> modülü <code class="module"><a href="/mod/worker.html">worker</a></code> modülü gibi 427 çok evreli bir modüldür, fakat aunı anda dahafazla isteğe yanıt 428 verecek şekilde tasarlanmıştır. Bunu, evreleri destekleyen bazı 429 işlemleri yapmamak suretiyle yeni isteklerle çalışacak ana evreleri 430 serbestleştirerek sağlar.</li> 431 432 <li><code class="module"><a href="/mod/prefork.html">prefork</a></code> modülü her biri tek bir evreye sahip 433 çok sayıda çocuk süreç kullanımını destekler. Her süreç aynı anda 434 tek bir bağlantıya hizmet sunar. Çoğu sistemde daha hızlı olması 435 nedeniyle <code class="module"><a href="/mod/worker.html">worker</a></code> modülüne göre daha iyi bir seçim 436 olarak görünürse de bunu daha fazla bellek kullanarak sağlar. 437 <code class="module"><a href="/mod/prefork.html">prefork</a></code> modülünün evresiz tasarımının 438 <code class="module"><a href="/mod/worker.html">worker</a></code> modülüne göre bazı yararlı tarafları 439 vardır: Çok evreli sistemlerde güvenilir olmayan üçüncü parti 440 modülleri kullanabilir ve evrelerde hata ayıklamanın yetersiz 441 kaldığı platformlarda hatalarını ayıklamak daha kolaydır.</li> 442 443 </ul> 444 445 <p>Bu modüller ve diğerleri hakkında daha ayrıntılı bilgi edinmek için 446 <a href="/mpm.html">Çok Süreçlilik Modülleri</a> belgesine 447 bakınız.</p> 448 449 450 451 <h3><a name="modules" id="modules">Modüller</a></h3> 452 453 454 455 <p>Bellek kullanımı başarım konusunda önemli olduğundan gerçekte 456 kullanmadığınız modülleri elemeye çalışmalısınız. Modülleri birer <a href="/dso.html">DSO</a> olarak derlediyseniz <code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code> yönergesinin bulunduğu satırı 457 açıklama haline getirmeniz modülden kurtulmanız için yeterli 458 olacaktır. Modülleri bu şekilde kaldırarak onların yokluğunda 459 sitenizin hala işlevlerini yerine getirdiğini görme şansına da 460 kavuşmuş olursunuz.</p> 461 462 <p>Ancak, eğer modülleri Apache çalıştırılabilirinin içine 463 gömmüşseniz istenmeyen modülleri kaldırmak için Apache'yi yeniden 464 derlemeniz gerekir.</p> 465 466 <p>Bu noktada bir soru akla gelebilir: Hangi modüller gerekli, 467 hangileri değil? Bu sorunun yanıtı şüphesiz siteden siteye değişir. 468 Ancak, olmazsa olmaz moüller olarak <code class="module"><a href="/mod/mod_mime.html">mod_mime</a></code>, 469 <code class="module"><a href="/mod/mod_dir.html">mod_dir</a></code> ve <code class="module"><a href="/mod/mod_log_config.html">mod_log_config</a></code> 470 modüllerini sayabiliriz. Bunlardan <code>mod_log_config</code> 471 olmadan da bir sitenin çalışabileceğinden hareketle bu modülün 472 varlığı isteğe bağlı olsa da bu modülü kaldırmanızı önermiyoruz.</p> 473 474 475 476 <h3>Atomik İşlemler</h3> 477 478 479 480 <p>Worker MPM'nin en son geliştirme sürümleri ve 481 <code class="module"><a href="/mod/mod_cache.html">mod_cache</a></code> gibi bazı modüller APR'nin atomik API'sini 482 kullanırlar. Bu API, düşük ayarlı evre eşzamanlamasında atomik 483 işlemler yapar.</p> 484 485 <p>Öntanımlı olarak, APR bu işlemleri hedef işletim sistemi/işlemci 486 platformunda kullanılabilecek en verimli mekanizmayı kullanarak 487 gerçekleştirir. Günümüz işlemcilerinin çoğu, örneğin, bir atomik 488 karşılaştırma ve takas (CAS) işlemini donanımda gerçekleştirmektedir. 489 Bazı platformlarda APR'nin atomik işlemler için öntanımlı olarak daha 490 yavaş olan mutekslere dayalı gerçeklenimi kullanmasının sebebi eski 491 işlemcilerde bu tür makine kodlarının yokluğudur. Apache'yi bu tür 492 platformalarda günümüz işlemcileriyde çalıştırmayı düşünüyorsanız 493 Apache'yi derlemek için yapılandırırken en hızlı atomik işlemin 494 seçilebilmesi için <code>--enable-nonportable-atomics</code> 495 seçeneğini kullanın:</p> 496 497 <div class="example"><p><code> 498 /buildconf<br /> 499 /configure --with-mpm=worker --enable-nonportable-atomics=yes 500 </code></p></div> 501 502 <p><code>--enable-nonportable-atomics</code> seçeneği şu platformlar 503 için uygundur:</p> 504 505 <ul> 506 507 <li>SPARC üzerinde Solaris<br /> 508 APR öntanımlı olarak, SPARC/Solaris üzerinde mutekslere dayalı 509 atomik işlemleri kullanır. Ancak, 510 <code>--enable-nonportable-atomics</code> yapılandırmasını 511 kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas 512 için uygun SPARC v8plus kodunu kullanacak şekilde kod üretilir. 513 Apache'yi bu seçenekle yapılandırırsanız atomik işlemler daha 514 verimli olacak fakat derlenen Apache çalıştırılabiliri sadece 515 UltraSPARC kırmığı üzerinde çalışacaktır. 516 </li> 517 518 <li>x86 üzerinde Linux<br /> 519 APR öntanımlı olarak, Linux üzerinde mutekslere dayalı atomik 520 işlemleri kullanır. Ancak, 521 <code>--enable-nonportable-atomics</code> yapılandırmasını 522 kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas 523 için uygun 486 kodunu kullanacak şekilde kod üretilir. Apache'yi 524 bu seçenekle yapılandırırsanız atomik işlemler daha verimli 525 olacak fakat derlenen Apache çalıştırılabiliri (386 üzerinde 526 değil) sadece 486 ve sonrası kırmıklarda çalışacaktır. 527 </li> 528 529 </ul> 530 531 532 533 <h3><code>mod_status</code> ve <code>ExtendedStatus On</code> 534 </h3> 535 536 537 538 <p><code class="module"><a href="/mod/mod_status.html">mod_status</a></code> modülünü derlemiş ve Apache'yi 539 yapılandırır ve çalıştırırken <code>ExtendedStatus On</code> satırını 540 da kullanmışsanız Apache her istek üzerinde 541 <code>gettimeofday(2)</code> (veya işletim sistemine bağlı olarak 542 <code>time(2)</code>) çağrısından başka (1.3 öncesinde) fazladan 543 defalarca <code>time(2)</code> çağrıları yapacaktır. Bu çağrılarla 544 durum raporununun zamanlama bilgilerini içermesi sağlanır. Başarımı 545 arttırmak için <code>ExtendedStatus off</code> yapın (zaten öntanımlı 546 böyledir).</p> 547 548 549 550 <h3><code>accept</code> dizgilemesi ve çok soketli işlem</h3> 551 552 553 554 <div class="warning"><h3>Uyarı:</h3> 555 <p>Bu bölüm, Apache HTTP sunucusunun 2.x sürümlerinde yapılan 556 değişikliklere göre tamamen güncellenmemiştir. Bazı bilgiler hala 557 geçerliyse de lütfen dikkatli kullanınız.</p> 558 </div> 559 560 <p>Burada Unix soket arayüzü gerçeklenirken ihmal edilen bir durumdan 561 bahsedeceğiz. HTTP sunucunuzun çok sayıda adresten çok sayıda portu 562 dinlemek için çok sayıda <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> yönergesi kullanmakta olduğunu varsayalım. Her 563 soketi çalıştığını görmek için denerken Apache bağlantı için 564 <code>select(2)</code> kullanacaktır. <code>select(2)</code> çağrısı 565 bu soketin üzerinde <em>sıfır</em> veya <em>en azından bir</em> 566 bağlantının beklemekte olduğu anlamına gelir. Apache'nin modeli çok 567 sayıda çocuk süreç içerir ve boşta olanların tümünde aynı anda yeni 568 bağlantılar denenebilir. Gerçekte çalışan kod bu olmasa da meramımızı 569 anlatmak için kodun şöyle bir şey olduğunu varsayabiliriz:</p> 570 571 <pre class="prettyprint lang-c"> for (;;) { 572 for (;;) { 573 fd_set accept_fds; 574 575 FD_ZERO (&accept_fds); 576 for (i = first_socket; i <= last_socket; ++i) { 577 FD_SET (i, &accept_fds); 578 } 579 rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL); 580 if (rc < 1) continue; 581 new_connection = -1; 582 for (i = first_socket; i <= last_socket; ++i) { 583 if (FD_ISSET (i, &accept_fds)) { 584 new_connection = accept (i, NULL, NULL); 585 if (new_connection != -1) break; 586 } 587 } 588 if (new_connection != -1) break; 589 } 590 process_the(new_connection); 591 }</pre> 592 593 594 <p>Bu özet gerçeklenim bir takım açlık sorunlarına sebep olur. Bu 595 döngünün çalışması sırasında aynı anda çok sayıda çocuk süreç yeniden 596 çağrılır ve istekler arasında kalan çoğu çocuk da <code>select</code> 597 ile engellenir. Engellenen tüm bu çocuklar soketlerden herhangi biri 598 üzerinde tek bir istek göründüğünde <code>select</code> tarafından 599 uyandırılıp işleme sokulmak üzere döndürülürler (uyandırılan çocuk 600 sayısı işletim sistemine ve zamanlama ayarlarına göre değişiklik 601 gösterir). Bunların hepsi döngüye katılıp bağlantı kabul etmeye 602 (<code>accept</code>) çalışırlar. Fakat içlerinden yalnız biri 603 (sadece bir bağlantı isteğinin mevcut olduğu varsayımıyla) bunu 604 başarabilir. Kalanının bağlantı kabul etmesi (<code>accept</code>) 605 engellenir. Bu durum, bu çocukları istekleri başka başka soketlerden 606 değil mecburen tek bir soketten kabul etmeye kilitler ve bu soket 607 üzerinde yeni bir istek belirip uyandırılana kadar bu durumda 608 kalırlar. Bu açlık sorunu ilk olarak <a href="http://bugs.apache.org/index/full/467">PR#467</a> sayılı raporla 609 belgelenmiştir. Bu sorunun en az iki çözümü vardır.</p> 610 611 <p>Çözümün biri engellenmeyen soket kullanımıdır. Bu durumda 612 <code>accept</code> çocukları engellemeyecek ve yapılan bir 613 bağlantının ardından diğer çocuklar durumları değişmeksizin bağlantı 614 beklemeye devam edeceklerdir. Fakat bu durum işlemci zamanının boşa 615 harcanmasına sebep olur. Seçilmiş (<code>select</code>) boşta on 616 çocuğun olduğunu ve bir bağlantı geldiğini varsayalım. Kalan dokuz 617 çocuk işine devam edip bağlantı kabul etmeyi (<code>accept</code>) 618 deneyecek, başarızsız olacak, dönecek başa, tekrar seçilecek 619 (<code>select</code>) ve böyle hiçbir iş yapmadan dönüp duracaktır. Bu 620 arada hizmet sunmakta olanlar da işlerini bitirdikten sonra bu 621 döngüdeki yerlerini alacaklardır. Aynı kutunun içinde boşta bir sürü 622 işlemciniz (çok işlemcili sistemler) yoksa bu çözüm pek verimli 623 olmayacaktır.</p> 624 625 <p>Diğer çözüm ise Apache tarafından kullanılan çözüm olup, girdiyi 626 bir iç döngüde sıraya sokmaktır. Döngü aşağıda örneklenmiştir (farklar 627 vurgulanmıştır):</p> 628 629 <pre class="prettyprint lang-c"> for (;;) { 630 <strong>accept_mutex_on ();</strong> 631 for (;;) { 632 fd_set accept_fds; 633 634 FD_ZERO (&accept_fds); 635 for (i = first_socket; i <= last_socket; ++i) { 636 FD_SET (i, &accept_fds); 637 } 638 rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL); 639 if (rc < 1) continue; 640 new_connection = -1; 641 for (i = first_socket; i <= last_socket; ++i) { 642 if (FD_ISSET (i, &accept_fds)) { 643 new_connection = accept (i, NULL, NULL); 644 if (new_connection != -1) break; 645 } 646 } 647 if (new_connection != -1) break; 648 } 649 <strong>accept_mutex_off ();</strong> 650 process the new_connection; 651 }</pre> 652 653 654 <p><code>accept_mutex_on</code> ve <code>accept_mutex_off</code> <a id="serialize" name="serialize">işlevleri</a> bir karşılıklı red 655 semoforu oluştururlar. Mutekse aynı anda sadece bir çocuk sahip 656 olabilir. Bu muteksleri gerçeklemek için çeşitli seçenekler vardır. 657 Seçim, <code>src/conf.h</code> (1.3 öncesi) veya 658 <code>src/include/ap_config.h</code> (1.3 ve sonrası) dosyasında 659 tanımlanmıştır. Bazı mimariler bir kilitleme seçeneğine sahip 660 değildir. Böyle mimarilerde çok sayıda <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> yönergesi kullanmak güvenilir 661 olmayacaktır.</p> 662 663 <p><code class="directive"><a href="/mod/core.html#mutex">Mutex</a></code> yönergesi, 664 <code>mpm-accept</code> muteks gerçeklenimini çalışma anında değiştirmek 665 için kullanılabilir. Farklı muteks gerçeklenimleri ile ilgili hususlar 666 bu yönergede belgelenmiştir.</p> 667 668 <p>Başka bir çözüm daha vardır ancak döngü kısmen dizgilenmeyeceğinden 669 (yani belli sayıda sürece izin verilemeyeceğinden) asla 670 gerçeklenmemiştir. Bu sadece, aynı anda çok sayıda çocuk sürecin 671 çalışabileceği ve dolayısıyla band genişliğinin tüm yönleriyle 672 kullanılabileceği çok işlemcili sistemlerde ilginç olabilirdi. Bu 673 gelecekte incelenmeye değer bir konu olmakla beraber çok sayıda HTTP 674 sunucusunun aynı anda aynı amaca hizmet edecek şekilde çalışması 675 standart olarak pek mümkün görülmediğinden bu olasılık çok 676 düşüktür.</p> 677 678 <p>En yüksek başarımı elde etmek için ideal olanı sunucuları 679 çalıştırırken çok sayıda <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> yönergesi kullanmamaktır. Fakat siz yine de 680 okumaya devam edin.</p> 681 682 683 684 <h3><code>accept</code> dizgilemesi - tek soket</h3> 685 686 687 688 <p>Çok soketli sunucular için yukarıda açıklananlar iyi güzel de tek 689 soketli sunucularda durum ne? Kuramsal olarak, bunların hiçbiriyle bir 690 sorunları olmaması gerekir. Çünkü yeni bir bağlantı gelene kadar tüm 691 çocuklar <code>accept(2)</code> ile engellenirler dolayısıyla hiçbir 692 açlık sorununun ortaya çıkmaması gerekir. Uygulamada ise son 693 kullanıcıdan gizli olarak, yukarıda engellenmeyen çocuklar çözümünde 694 bahsedilenle hemen hemen aynı "boşa dönüp durma" davranışı mevcuttur. 695 Çoğu TCP yığıtı bu yolu gerçeklemiştir. Çekirdek, yeni bir bağlantı 696 ortaya çıktığında <code>accept</code> ile engellenen tüm süreçleri 697 uyandırır. Bu süreçlerden bağlantıyı alan kullanıcı bölgesine geçerken 698 çekirdek içinde döngüde olan diğerleri de yeni bağlantı keşfedilene 699 kadar uykularına geri dönerler. Bu çekirdek içi döngü, kullanıcı 700 bölgesindeki kodlara görünür değildir ama bu olmadıkları anlamına 701 gelmez. Bu durum, çok soketli engellenmeyen çocuklar çözümündeki boşa 702 döngünün sebep olduğu gereksiz işlemci yükü sorununu içinde 703 barındırır.</p> 704 705 <p>Bununla birlikte, tek soketli durumda bile bundan daha verimli bir 706 davranış sergileyen bir çok mimari bulduk. Bu aslında hemen hemen her 707 durumda öntanımlı olarak böyledir. Linux altında yapılan üstünkörü 708 denemelerde (128MB bellekli çift Pentium pro 166 işlemcili makinede 709 Linux 2.0.30) tek sokette dizgilemenin dizgilenmemiş duruma göre 710 saniyede %3 daha az istekle sonuçlandığı gösterilmiştir. Fakat 711 dizgilenmemiş tek soket durumunda her istekte 100ms'lik ek bir gecikme 712 olduğu görülmüştür. Bu gecikmenin sebebi muhtemelen uzun mesafeli 713 hatlar olup sadece yerel ağlarda söz konusudur. Tek soketli 714 dizgilemeyi geçersiz kılmak için 715 <code>SINGLE_LISTEN_UNSERIALIZED_ACCEPT</code> tanımlarsanız tek 716 soketli sunucularda artık dizgileme yapılmayacaktır.</p> 717 718 719 720 <h3>Kapatmayı zamana yaymak</h3> 721 722 723 724 <p><a href="http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt">draft-ietf-http-connection-00.txt</a> taslağının 8. bölümünde 725 bahsedildiği gibi, bir HTTP sunucusunun protokolü <strong>güvenilir 726 şekilde</strong> gerçeklemesi için her iki yöndeki iletişimi 727 birbirinden bağımsız olarak (iki yönlü bir TCP bağlantısının her 728 yarısını diğerinden bağımsız olarak) kapatması gerekir.</p> 729 730 <p>Bu özellik Apache'ye eklendiğinde Unix'in çeşitli sürümlerinde 731 uzgörüsüzlükten dolayı bir takım geçici telaş sorunlarına sebep oldu. 732 TCP belirtimi <code>FIN_WAIT_2</code> durumunda bir zaman aşımından 733 bahsetmez ama yasaklamaz da. Zaman aşımı olmayan sistemlerde, Apache 734 1.2 çoğu soketin sonsuza kadar <code>FIN_WAIT_2</code> durumunda 735 takılıp kalmasına sebep olur. Çoğu durumda, satıcıdan sağlanan en son 736 TCP/IP yamalarını uygulanarak bu önlenebilir. Satıcının hiçbir yeni 737 yama dağıtmadığı durumlarda (örneğin, SunOS4 -- bir kaynak lisansı ile 738 insanlar bunu kendileri yamayabilirse de) bu özelliği devre dışı 739 bırakmaya karar verdik.</p> 740 741 <p>Bunun üstesinden gelmenin iki yolu vardır. Bunlardan biri 742 <code>SO_LINGER</code> soket seçeneğidir. Bu işin kaderi buymuş gibi 743 görünürse de çoğu TCP/IP yığıtında bu gerektiği gibi 744 gerçeklenmemiştir. Bu yığıtlar üzerinde, bu yöntemin, doğru bir 745 gerçeklenimle bile (örneğin, Linux 2.0.31) sonraki çözümden daha 746 pahalı olduğu ortaya çıkmıştır.</p> 747 748 <p>Çoğunlukla, Apache bunu (<code>http_main.c</code> içindeki) 749 <code>lingering_close</code> adında bir işlevle gerçekler. Bu işlev 750 kabaca şöyle görünür:</p> 751 752 <pre class="prettyprint lang-c"> void lingering_close (int s) 753 { 754 char junk_buffer[2048]; 755 756 /* shutdown the sending side */ 757 shutdown (s, 1); 758 759 signal (SIGALRM, lingering_death); 760 alarm (30); 761 762 for (;;) { 763 select (s for reading, 2 second timeout); 764 if (error) break; 765 if (s is ready for reading) { 766 if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) { 767 break; 768 } 769 /* just toss away whatever is here */ 770 } 771 } 772 773 close (s); 774 }</pre> 775 776 777 <p>Bağlantı sonunda bu doğal olarak biraz daha masrafa yol açar, fakat 778 güvenilir bir gerçeklenim için bu gereklidir. HTTP/1.1'in daha yaygın 779 kullanılmaya başlanması ve tüm bağlantıların kalıcı hale gelmesiyle bu 780 gerçeklenim daha fazla istek üzerinden kendi masrafını 781 karşılayacaktır. Ateşle oynamak ve bu özelliği devre dışı bırakmak 782 isterseniz <code>NO_LINGCLOSE</code>'u tanımlayabilirsiniz, fakat bu 783 asla önerilmez. Özellikle, HTTP/1.1'den itibaren boruhatlı kalıcı 784 bağlantıların <code>lingering_close</code> kullanmaya başlaması mutlak 785 bir gerekliliktir (ve <a href="http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html"> 786 boruhatlı bağlantıların daha hızlı</a> olması nedeniyle bu 787 bağlantıları desteklemek isteyebilirsiniz).</p> 788 789 790 791 <h3>Çetele Dosyası</h3> 792 793 794 795 <p>Apache'nin ana ve alt süreçleri birbirleriyle çetele denen birşey 796 üzerinden haberleşirler. Bunun en mükemmel şekilde paylaşımlı bellekte 797 gerçeklenmesi gerekir. Eriştiğimiz veya portlarını ayrıntılı olarak 798 belirttiğimiz işletim sistemleri için bu, genellikle paylaşımlı bellek 799 kullanılarak gerçeklenir. Geri kalanlar, öntanımlı olarak bunu bir 800 disk dosyası kullanarak gerçekler. Bir disk dosyaı yavaş olmanın yanı 801 sıra güvenilir de değildir (ve daha az özelliğe sahiptir). Mimarinizin 802 <code>src/main/conf.h</code> dosyasını inceleyin ve 803 <code>USE_MMAP_SCOREBOARD</code> veya 804 <code>USE_SHMGET_SCOREBOARD</code>'a bakın. Bu ikisinden birinin (ve 805 yanı sıra sırasıyla <code>HAVE_MMAP</code> veya 806 <code>HAVE_SHMGET</code>'in) tanımlanmış olması, sağlanan paylaşımlı 807 bellek kodunu etkinleştirir. Eğer sisteminiz diğer türdeki paylaşımlı 808 belleğe sahipse, <code>src/main/http_main.c</code> dosyasını açıp, 809 Apache'de bu belleği kullanması gereken kanca işlevleri ekleyin (Bize 810 de bir yama yollayın, lütfen).</p> 811 812 <div class="note">Tarihsel bilgi: Apache'nin Linux uyarlaması, Apache'nin 1.2 813 sürümüne kadar paylaşımlı belleği kullanmaya başlamamıştı. Bu kusur, 814 Apache'nin Linux üzerindeki erken dönem sürümlerinin davranışlarının 815 zayıf ve güvenilmez olmasına yol açmıştı.</div> 816 817 818 819 <h3>DYNAMIC_MODULE_LIMIT</h3> 820 821 822 823 <p>Devingen olarak yüklenen modülleri kullanmamak niyetindeyseniz 824 (burayı okuyan ve sunucunuzun başarımını son kırıntısına kadar 825 arttırmakla ilgilenen biriyseniz bunu düşünmezsiniz), sunucunuzu 826 derlerken seçenekler arasına <code>-DDYNAMIC_MODULE_LIMIT=0</code> 827 seçeneğini de ekleyin. Bu suretle, sadece, devingen olarak yüklenen 828 modüller için ayrılacak belleği kazanmış olacaksınız.</p> 829 830 831 832 </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 833<div class="section"> 834<h2><a name="trace" id="trace">Ek: Bir çağrı izlemesinin ayrıntılı çözümlemesi</a></h2> 835 836 837 838 <p>Burada, Solaris 8 üzerinde worker MPM'li Apache 2.0.38'in bir sistem 839 çağrısı izlenmektedir. Bu izleme şu komutla elde edilmiştir:</p> 840 841 <div class="example"><p><code> 842 truss -l -p <var>httpd_çocuk_pidi</var>. 843 </code></p></div> 844 845 <p><code>-l</code> seçeneği, truss'a hafif bir sürecin yaptığı her 846 sistem çağrısını (hafif süreç -- HS -- Solaris'in bir çekirdek seviyesi 847 evreleme biçimi) günlüğe yazmasını söyler.</p> 848 849 <p>Diğer sistemlerin sistem çağrılarını izleyen farklı araçları vardır 850 (<code>strace</code>, <code>ktrace</code>, <code>par</code> gibi). 851 Bunlar da benzer çıktılar üretirler.</p> 852 853 <p>Bu izleme sırasında, bir istemci httpd'den 10 KB'lık duruk bir dosya 854 talebinde bulunmuştur. Duruk olmayan veya içerik uzlaşımlı isteklerin 855 izleme kayıtları vahşice (bazı durumlarda epey çirkince) farklı 856 görünür.</p> 857 858 <div class="example"><p><code> 859 /67: accept(3, 0x00200BEC, 0x00200C0C, 1) (uykuda...)<br /> 860 /67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9 861 </code></p></div> 862 863 <p>Bu izlemede, dinleyen evre HS #67 içinde çalışmaktadır.</p> 864 865 <div class="note"><code>accept(2)</code> dizgelemesinin olmayışına dikkat edin. 866 Özellikle bu platformda worker MPM, çok sayıda portu dinlemedikçe, 867 öntanımlı olarak dizgeleştirilmemiş bir accept çağrısı kullanır.</div> 868 869 <div class="example"><p><code> 870 /65: lwp_park(0x00000000, 0) = 0<br /> 871 /67: lwp_unpark(65, 1) = 0 872 </code></p></div> 873 874 <p>Bağlantının kabul edilmesiyle, dinleyici evre isteği yerine getirmek 875 üzere bir worker evresini uyandırır. Bu izlemede, isteği yerine getiren 876 worker evresi HS #65'e aittir.</p> 877 878 <div class="example"><p><code> 879 /65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0 880 </code></p></div> 881 882 <p>Sanal konakların gerçeklenimi sırasında, Apache'nin, bağlantıları 883 kabul etmek için kullanılan yerel soket adreslerini bilmesi gerekir. 884 Çoğu durumda bu çağrıyı bertaraf etmek mümkündür (hiç sanal konağın 885 olmadığı veya <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> 886 yönergelerinin mutlak adreslerle kullanıldığı durumlarda). Fakat bu en 887 iyilemeleri yapmak için henüz bir çaba harcanmamıştır.</p> 888 889 <div class="example"><p><code> 890 /65: brk(0x002170E8) = 0<br /> 891 /65: brk(0x002190E8) = 0 892 </code></p></div> 893 894 <p><code>brk(2)</code> çağrıları devingen bellekten bellek ayırır. httpd 895 çoğu isteği yerine getirirken özel bellek ayırıcılar 896 (<code>apr_pool</code> ve <code>apr_bucket_alloc</code>) kullandığından 897 bunlar bir sistem çağrısı izlemesinde nadiren görünür. Bu izlemede, 898 httpd henüz yeni başlatıldığından, özel bellek ayırıcıları oluşturmak 899 için ham bellek bloklarını ayırmak amacıyla <code>malloc(3)</code> 900 çağrıları yapması gerekir.</p> 901 902 <div class="example"><p><code> 903/65: fcntl(9, F_GETFL, 0x00000000) = 2<br /> 904/65: fstat64(9, 0xFAF7B818) = 0<br /> 905/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0<br /> 906/65: fstat64(9, 0xFAF7B818) = 0<br /> 907/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0<br /> 908/65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0<br /> 909/65: fcntl(9, F_SETFL, 0x00000082) = 0 910 </code></p></div> 911 912 <p>Ardından, worker evresi istemciye (dosya tanıtıcısı 9) engellenmeyen 913 kipte bir bağlantı açar. <code>setsockopt(2)</code> 914 ve <code>getsockopt(2)</code> çağrıları, Solaris libc'sinin soketler 915 üzerindeki <code>fcntl(2)</code> çağrısı yanında birer yan etkiden 916 ibarettirler.</p> 917 918 <div class="example"><p><code> 919 /65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97 920 </code></p></div> 921 922 <p>Worker evresi istemciden isteği okur.</p> 923 924 <div class="example"><p><code> 925/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0<br /> 926/65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10 927 </code></p></div> 928 929 <p>Bu httpd <code>Options FollowSymLinks</code> ve <code>AllowOverride 930 None</code> ile yapılandırılmıştır. Bu bakımdan, ne istenen dosya ile 931 sonuçlanan yol üzerindeki her dizinde <code>lstat(2)</code> çağrısına ne 932 de <code>.htaccess</code> dosyalarına bakılmasına gerek vardır. 933 <code>stat(2)</code> çağrısı basitçe dosya için şunları doğrulamak 934 amacıyla yapılır: 1) dosya mevcuttur ve 2) bir dizin değil normal bir 935 dosyadır.</p> 936 937 <div class="example"><p><code> 938 /65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269 939 </code></p></div> 940 941 <p>Bu örnekte, httpd, istenen dosyayı ve HTTP yanıt başlığını tek bir 942 <code>sendfilev(2)</code> sistem çağrısı ile göndermektedir. Dosya 943 gönderim işleminin anlamı sistemden sisteme değişiklik gösterir. Bazı 944 sistemlerde, <code>sendfile(2)</code> çağrısından önce başlıkları 945 göndermek için <code>write(2)</code> veya <code>writev(2)</code> 946 çağrısı yapmak gerekir.</p> 947 948 <div class="example"><p><code> 949 /65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78 950 </code></p></div> 951 952 <p>Bu <code>write(2)</code> çağrısı isteği erişim günlüğüne kaydeder. Bu 953 izlemede eksik olan tek şey, <code>time(2)</code> çağrısıdır. Apache 954 1.3'ün aksine, Apache 2.x zamana bakmak için 955 <code>gettimeofday(3)</code> çağırısını kullanır. Linux ve Solaris gibi 956 bazı işletim sistemleri, <code>gettimeofday</code> işlevinin, sıradan 957 bir sistem çağrısından daha fazla götürüsü olmayan en iyilenmiş bir 958 gerçeklenimine sahiptir.</p> 959 960 <div class="example"><p><code> 961 /65: shutdown(9, 1, 1) = 0<br /> 962 /65: poll(0xFAF7B980, 1, 2000) = 1<br /> 963 /65: read(9, 0xFAF7BC20, 512) = 0<br /> 964 /65: close(9) = 0 965 </code></p></div> 966 967 <p>Burada worker evresi bağlantıyı zamana yaymaktadır.</p> 968 969 <div class="example"><p><code> 970 /65: close(10) = 0<br /> 971 /65: lwp_park(0x00000000, 0) (uykuda...) 972 </code></p></div> 973 974 <p>Son olarak, worker evresi teslim edilen dosyayı kapattıktan sonra 975 dinleyici evre tarafından başka bir bağlantı atanıncaya kadar beklemeye 976 alınır.</p> 977 978 <div class="example"><p><code> 979 /67: accept(3, 0x001FEB74, 0x001FEB94, 1) (uykuda...) 980 </code></p></div> 981 982 <p>Bu arada, dinleyici evre bağlantıyı bir worker evresine atar atamaz 983 başka bir bağlantıyı beklemeye başlar (Mevcut tüm evreler meşgulse 984 dinleyici evreyi baskılayan worker MPM'nin akış denetim şemasına konu 985 olur). Bu izlemede görünmüyor olsa da sonraki <code>accept(2)</code> 986 çağrısı, yeni bağlantı kabul eden worker evresine paralel olarak 987 yapılabilir (aşırı yük durumlarında normal olarak, bu yapılır).</p> 988 989 </div></div> 990<div class="bottomlang"> 991<p><span>Mevcut Diller: </span><a href="/en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English"> en </a> | 992<a href="/fr/misc/perf-tuning.html" hreflang="fr" rel="alternate" title="Français"> fr </a> | 993<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | 994<a href="/tr/misc/perf-tuning.html" title="Türkçe"> tr </a></p> 995</div><div class="top"><a href="#page-header"><img src="/images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Yorum</a></h2><div class="warning"><strong>Notice:</strong><br />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 <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div> 996<script type="text/javascript"><!--//--><![CDATA[//><!-- 997var comments_shortname = 'httpd'; 998var comments_identifier = 'http://httpd.apache.org/docs/2.4/misc/perf-tuning.html'; 999(function(w, d) { 1000 if (w.location.hostname.toLowerCase() == "httpd.apache.org") { 1001 d.write('<div id="comments_thread"><\/div>'); 1002 var s = d.createElement('script'); 1003 s.type = 'text/javascript'; 1004 s.async = true; 1005 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; 1006 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); 1007 } 1008 else { 1009 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); 1010 } 1011})(window, document); 1012//--><!]]></script></div><div id="footer"> 1013<p class="apache">Copyright 2014 The Apache Software Foundation.<br /><a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> altında lisanslıdır.</p> 1014<p class="menu"><a href="/mod/">Modüller</a> | <a href="/mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="/glossary.html">Terimler</a> | <a href="/sitemap.html">Site Haritası</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- 1015if (typeof(prettyPrint) !== 'undefined') { 1016 prettyPrint(); 1017} 1018//--><!]]></script> 1019</body></html>