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