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="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
21<div id="path">
22<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Sunucusu</a> &gt; <a href="http://httpd.apache.org/docs/">Belgeleme</a> &gt; <a href="../">Sürüm 2.4</a> &gt; <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">&nbsp;en&nbsp;</a> |
25<a href="/fr/misc/perf-tuning.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
26<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
27<a href="/tr/misc/perf-tuning.html" title="Türkçe">&nbsp;tr&nbsp;</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>&lt;Location /server-status&gt;</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&lt;Files ~ "\.(html|cgi)$"&gt;
147  HostnameLookups on
148&lt;/Files&gt;</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&lt;Directory /&gt;
170  Options SymLinksIfOwnerMatch
171&lt;/Directory&gt;</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&lt;Directory /&gt;
184  Options FollowSymLinks
185&lt;/Directory&gt;
186
187&lt;Directory /siteler/htdocs&gt;
188  Options -FollowSymLinks +SymLinksIfOwnerMatch
189&lt;/Directory&gt;</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&lt;Directory /&gt;
215  AllowOverride all
216&lt;/Directory&gt;</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 (&amp;accept_fds);
576            for (i = first_socket; i &lt;= last_socket; ++i) {
577              FD_SET (i, &amp;accept_fds);
578            }
579            rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);
580            if (rc &lt; 1) continue;
581            new_connection = -1;
582            for (i = first_socket; i &lt;= last_socket; ++i) {
583              if (FD_ISSET (i, &amp;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 (&amp;accept_fds);
635            for (i = first_socket; i &lt;= last_socket; ++i) {
636              FD_SET (i, &amp;accept_fds);
637            }
638            rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);
639            if (rc &lt; 1) continue;
640            new_connection = -1;
641            for (i = first_socket; i &lt;= last_socket; ++i) {
642              if (FD_ISSET (i, &amp;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)) &lt;= 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">&nbsp;en&nbsp;</a> |
992<a href="/fr/misc/perf-tuning.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
993<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
994<a href="/tr/misc/perf-tuning.html" title="Türkçe">&nbsp;tr&nbsp;</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&amp;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>