{"id":1928,"date":"2017-10-02T01:09:52","date_gmt":"2017-10-01T22:09:52","guid":{"rendered":"http:\/\/blog.profelis.com.tr\/?p=1928"},"modified":"2023-02-01T10:58:00","modified_gmt":"2023-02-01T07:58:00","slug":"hangi-io-scheduler","status":"publish","type":"post","link":"https:\/\/profelis.com.tr\/en\/2017\/10\/02\/hangi-io-scheduler\/","title":{"rendered":"Linux 101: Hangi I\/O Zamanlay\u0131c\u0131?"},"content":{"rendered":"<h2>Linux 101: Hangi I\/O Zamanlay\u0131c\u0131?<\/h2>\n<blockquote><p>\u0130ster performans optimizasyonunun \u00f6l\u00e7\u00fcs\u00fcn\u00fc ka\u00e7\u0131rmak, ister entellekt\u00fcel bir teknik dala\u015fa giri\u015fmek olarak alg\u0131lay\u0131n, m\u00fc\u015fteri e\u011fer &#8220;Hangi I\/O Scheduler&#8217;\u0131 kullanmam\u0131z\u0131 \u00f6nerirsiniz?&#8221; diye sorarsa cevap vermek zorundas\u0131n\u0131z.<\/p>\n<p>Evet, tamamen retorik bir soru oldu\u011funun fark\u0131nday\u0131m bu hali ile. Zira, \u00e7evresel de\u011fi\u015fkenleri ben biliyorum ama siz hen\u00fcz bilmiyorsunuz; soracaks\u0131n\u0131z: Hangi disk, hangi RAID, hangi ama\u00e7, hangi uygulama, hangi i\u015fletim sistemi, sanal\/fiziksel&#8230; Uzay\u0131p gidecek sorular. Bilmeyenler i\u00e7in \u00f6nce &#8220;<em>Neden \u00e7evresel de\u011fi\u015fkenler \u00f6nemli?<\/em>&#8221; sorusunun cevab\u0131n\u0131 vermek gerek, bunun i\u00e7in <strong>I\/O Zamanlay\u0131c\u0131 \/ Scheduler 101<\/strong> dersi a\u015fa\u011f\u0131da:<\/p><\/blockquote>\n<h2>I\/O Scheduler Nedir?<\/h2>\n<p>Linux sistemlerde, \u00e7ekirde\u011fin blok ayg\u0131tlara (<em>\u00f6rn: disk<\/em>) yazma ve ayg\u0131tlardan okuma esnas\u0131nda i\u015fleme (commit) y\u00f6ntemini belirleyen d\u00fczenektir. Bu d\u00fczenek, hengi okuma, yazma i\u015flemlerinin ileten s\u00fcrecin \u00f6nem derecesine, ayg\u0131t\u0131n t\u00fcr\u00fcne, i\u015flemin uzunlu\u011funa vb de\u011fi\u015fkenlerle hangi s\u0131rayla diske yaz\u0131laca\u011f\u0131n\u0131 veya diskten okunaca\u011f\u0131n\u0131 belirleyen g\u00f6revlidir.<\/p>\n<p>De\u011fi\u015fen disk yap\u0131lar\u0131, RAID sistemleri (Donan\u0131msal, Yaz\u0131l\u0131msal vb), disk teknolojileri (SCSI, SATA, SSD) vb sebeplerle, zaman i\u00e7erisinde birden fazla ve farkl\u0131 I\/O zamanlay\u0131c\u0131lar\u0131 geli\u015ftirilmi\u015f, \u00e7ekirdek s\u00fcr\u00fcm\u00fcnden s\u00fcr\u00fcm\u00fcne farkl\u0131 zamanlay\u0131c\u0131lar varsay\u0131lan olarak atanm\u0131\u015flard\u0131r. Bu durum hem \u00e7ekirde\u011fe hem de da\u011f\u0131t\u0131ma g\u00f6re de\u011fi\u015fir bir hal alm\u0131\u015f, 2.6 s\u00fcr\u00fcm \u00e7ekirdeklerden itibaren komut sat\u0131r\u0131ndan veya a\u00e7\u0131l\u0131\u015f esnas\u0131nda de\u011fi\u015ftirilebilir bir hale gelmi\u015ftir. En s\u0131k kullan\u0131lan zamanlay\u0131c\u0131lar CFQ, NOOP, Anticipatory, Deadline olmu\u015ftur.<\/p>\n<h3>Farkl\u0131 Zamanlay\u0131c\u0131lar<\/h3>\n<p><b>CFQ, Completely Fair Queuing, <\/b>Tamamen Adil Kuyruklama olarak tan\u0131mlayabilece\u011fimiz zamanlay\u0131c\u0131 senkron ve asenkron istekler i\u00e7in farkl\u0131 kuyruklar olu\u015ftururken, s\u00fcre\u00e7ler i\u00e7in de duruma g\u00f6re bir tak\u0131m farkl\u0131 kuyruklar olu\u015fturarak okuma\/yazma i\u015flemlerini s\u0131ralar. I\/O \u00f6nceli\u011fine g\u00f6re isteklere farkl\u0131 zaman dilimleri atayarak kuyru\u011fun d\u00fczenini sa\u011flar. Her i\u015flemin sonunda bir zaman aral\u0131\u011f\u0131 mevcuttur. Bu aral\u0131k yeni kuyruk a\u00e7ma, s\u00fcre\u00e7ten yeni istek bekleme vb konularda optimizasyonu sa\u011flamak ama\u00e7l\u0131 belirlenmi\u015f olsa da performans ayar\u0131 yap\u0131l\u0131rken ilk olarak ele al\u0131nan de\u011fi\u015fken olarak yeniden yap\u0131land\u0131r\u0131labilir.<\/p>\n<p><strong>NOOP Zamanlay\u0131c\u0131, <\/strong>en basit zamanlay\u0131c\u0131d\u0131r. \u00c7al\u0131\u015fma y\u00f6ntemi basit\u00e7e t\u00fcm gelen isteklerin bir <strong>FIFO<\/strong> (<em>First In First Out &#8211; \u0130lk Gelen \u0130lk \u00c7\u0131kar<\/em>) kuyru\u011funa at\u0131lmas\u0131 prensibine dayan\u0131r. Bu t\u00fcr bir \u00e7al\u0131\u015fma mekanizmas\u0131, sadece ve sadece host sistemin gelen isteklerin \u00f6nceli\u011fi konusunda bilgi sahibi olmad\u0131\u011f\u0131 durumlarda veya okuma\/yazma verimlili\u011finde disk kafas\u0131n\u0131n pozisyonunun bu verimlili\u011fe etkisinin olmad\u0131\u011f\u0131 SSD diskler gibi diskler s\u00f6z konusu oldu\u011funda etkin olabilir. Buna kar\u015f\u0131n, SSD veya Flash diskler de s\u00f6z konusu olsa yine de tam anlam\u0131yla efektif bir zamanlay\u0131c\u0131 de\u011fildir. Zira, d\u00fc\u015f\u00fck gecikmeli bu t\u00fcr disklerde dahi, sistem baz\u0131 isteklerin ayn\u0131 s\u00fcre\u00e7lerde birle\u015ftirilerek i\u015flenmesinden fayda g\u00f6rmektedir.<\/p>\n<p><strong>Anticipatory Zamanlay\u0131c\u0131,<\/strong>\u00a0kafal\u0131 disklerin I\/O performans\u0131na y\u00f6nelik performans artt\u0131r\u0131c\u0131 bir algoritma i\u00e7erir. \u0130\u015flemleri kuyruk i\u00e7erisinde s\u0131ralarken, diskin kafa pozisyonuna, kafa say\u0131s\u0131na (RAID), disk t\u00fcr\u00fcne vb de\u011fi\u015fkenlerle karar vererek, bir sonraki okuma\/yazma i\u015flemine hangi istekten ba\u015flayaca\u011f\u0131n\u0131 belirleyerek \u00e7al\u0131\u015f\u0131r. 2.6.33 s\u00fcr\u00fcm\u00fcnden itibaren \u00e7ekirdekten \u00e7\u0131kart\u0131lm\u0131\u015f olmas\u0131n\u0131n sebebi, benzeri bir ince ayar\u0131n ve performans art\u0131\u015f\u0131n\u0131n CFQ&#8217;nun yeni s\u00fcr\u00fcmleri ile ula\u015f\u0131labilmesinden ve hizmet etti\u011fi donan\u0131m tipinin limitli olmas\u0131ndan kaynaklanmas\u0131d\u0131r.<\/p>\n<p><strong>Deadline Zamanlay\u0131c\u0131,<\/strong> bir iste\u011fe bir <strong>son teslim tarihi<\/strong>\u00a0(<em>deadline<\/em>) verebilmesi ile di\u011ferlerinden farkl\u0131la\u015f\u0131r. Okuma ve Yazma i\u015flemleri i\u00e7in iki farkl\u0131 kuyruk kullan\u0131r. Bir son teslim tarihi verebilmesi sayesinde s\u00fcre\u00e7lerin okuma\/yazma (I\/O) beklerken ne kadar bekleyeceklerini bilmemekten kaynakl\u0131, s\u00fcreci ba\u015flatan ana s\u00fcrecin (<em>\u00f6rn: apache<\/em>) kendi verimlili\u011finin d\u00fc\u015fmesinin (starvation) engellenmesi ama\u00e7lanm\u0131\u015ft\u0131r. E\u011fer zamanlay\u0131c\u0131 isteklerin yo\u011funlu\u011fundan kaynakl\u0131 olarak bir s\u00fcrece ait i\u015flemin son teslim tarihini ge\u00e7irirse, kuyruktan bir sonraki iste\u011fi \u00e7ekerek i\u015flem yapar. B\u00f6ylece kullan\u0131m tarihi dolmu\u015f bir I\/O iste\u011fine sahip olan s\u00fcre\u00e7 duruma uygun exit kodunu \u00fcst s\u00fcrecine ileterek \u00e7\u0131k\u0131\u015f yapar ve bellekte, i\u015flemcide daha fazla yer kaplamas\u0131n\u0131 \u00f6nler. Okuma i\u015flemlerine daha fazla \u00f6ncelik verir, zira okuma i\u015flemi ayg\u0131t \u00fczerindeki alan\u0131 de\u011fi\u015fime bloklamaktad\u0131r. Okuma i\u015flemlerinde varsay\u0131lan son teslim tarihinin kullan\u0131m\u0131n\u0131n dolmas\u0131 i\u00e7in bekleme s\u00fcresi 500 milisaniye iken, yazma i\u015flemlerinde bu 5 saniyedir.<\/p>\n<p>sysfs \u00fczerinden yukar\u0131da bahsedilen ayarlar performans optimizasyonu amac\u0131yla yeniden d\u00fczenlenebilir:\u00a0<strong>fifo_batch<\/strong> (int), <strong>read_expire<\/strong> (int), <strong>write_expire<\/strong> (int), <strong>writes_starved<\/strong> (int), <strong>front_merges<\/strong> (int)<\/p>\n<h2>Performans Optimizasyonunda I\/O Scheduler&#8217;\u0131n Rol\u00fc<\/h2>\n<p>Bir Linux i\u015fletim sisteminde birden fazla I\/O zamanlay\u0131c\u0131 mevcut olmakla beraber, \u00e7ekirde\u011fin sizin ad\u0131n\u0131za en performansl\u0131 zamanlay\u0131c\u0131y\u0131 se\u00e7me kabiliyeti yoktur. Bu sebeple kullan\u0131m amac\u0131n\u0131za ve ne kadar performans istedi\u011finizi ba\u011fl\u0131 olarak gerekti\u011finde ilgili disk birimleri i\u00e7in io zamanlay\u0131c\u0131y\u0131 sizin se\u00e7meniz gerekir.<\/p>\n<p>Tarih\u00e7eye bakarsak, uzun bir d\u00f6nem anticipatory zamanlay\u0131c\u0131 varsay\u0131lan olmu\u015f, CFQ geli\u015ftirildikten sonra ise, CFQ&#8217;nun varkl\u0131 s\u00fcr\u00fcmleri aras\u0131nda sadece k\u0131sa bir d\u00f6nem 2.6.0 ve 2.6.18 aras\u0131nda varsay\u0131lan zamanlay\u0131c\u0131 olarak en k\u0131sa \u00f6m\u00fcrl\u00fc varsay\u0131lan zamanlay\u0131c\u0131 olmu\u015ftur.\u00a0Kendi diz\u00fcst\u00fc bilgisayar\u0131n\u0131zda SSD diskler varsa basit\u00e7e NOOP, sanalla\u015ft\u0131rmada konuk sistemler i\u00e7in deadline veya noop, ne yapaca\u011f\u0131n\u0131z\u0131 bilmiyorsan\u0131z varsay\u0131lan CFQ zamanlay\u0131c\u0131y\u0131 kullanabilirsiniz.<\/p>\n<p>Sistemde var olan zamanlay\u0131c\u0131lar\u0131 ve kullan\u0131lmakta olan\u0131 g\u00f6rmek i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz. Bu sistemde noop, deadline ve cfq mevcuttur, ve k\u00f6\u015feli parantez i\u00e7erisinde yer alan cfq&#8217;nun aktif zamanlay\u0131c\u0131 oldu\u011funu g\u00f6rebiliriz.<\/p>\n<pre><strong>root@dev:~#<\/strong> cat \/sys\/block\/sda\/queue\/scheduler\nnoop deadline <strong>[cfq]\n<\/strong><\/pre>\n<p>Dikkat ederseniz zamanlay\u0131c\u0131 diske g\u00f6re de\u011fi\u015febilmektedir. Yani \u00e7al\u0131\u015fma zaman\u0131 parametreleri ile, sistemin kendi diski \u00fczerinde cfq zamanlay\u0131c\u0131 kullan\u0131rken, veritaban\u0131 dosyalar\u0131n\u0131n yer ald\u0131\u011f\u0131 disk \u00fczerinde farkl\u0131 bir zamanlay\u0131c\u0131 \u00f6rne\u011fin noop kullan\u0131labilmektedir. Bu sayede birden fazla disk t\u00fcr\u00fcn\u00fcn bulundu\u011fu g\u00fcn\u00fcm\u00fcz sistemlerinde depolama biriminin t\u00fcr\u00fcne veya \u00e7al\u0131\u015fan uygulamaya g\u00f6re zamanlay\u0131c\u0131 belirlemek m\u00fcmk\u00fcn hale gelmi\u015ftir.<\/p>\n<p>Sanalla\u015ft\u0131rma i\u00e7in RedHat taraf\u0131ndan \u00f6nerilen zamanlay\u0131c\u0131 ile Oracle kullan\u0131m\u0131 i\u00e7in \u00f6nerilen zamanlay\u0131c\u0131 farkl\u0131 olabilir.<\/p>\n<p>Son olarak, yukar\u0131da bahsedilen neredeyse t\u00fcm zamanlay\u0131c\u0131lar\u0131n yazar\u0131, Linux \u00e7ekirde\u011finde blok sisteminin y\u00fcr\u00fct\u00fcc\u00fcs\u00fc, \u00e7ok uzun zamandan beri bir Linux \u00e7ekirdek geli\u015ftiricisi olan Jens Axboe&#8217;ye selam ve sayg\u0131lar\u0131m\u0131z\u0131 sunmak isteriz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0130ster performans optimizasyonunun \u00f6l\u00e7\u00fcs\u00fcn\u00fc ka\u00e7\u0131rmak, ister entellekt\u00fcel bir teknik dala\u015fa giri\u015fmek olarak alg\u0131lay\u0131n, m\u00fc\u015fteri e\u011fer &#8220;Hangi I\/O Scheduler&#8217;\u0131 kullanmam\u0131z\u0131 \u00f6nerirsiniz?&#8221; diye sorarsa cevap vermek zorundas\u0131n\u0131z. Bu sorunun bir yan\u0131t\u0131 yok, birden fazla var&#8230;<\/p>","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[76,45],"tags":[61],"class_list":["post-1928","post","type-post","status-publish","format-standard","hentry","category-linux","category-yazi","tag-linux"],"_links":{"self":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts\/1928","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/comments?post=1928"}],"version-history":[{"count":0,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts\/1928\/revisions"}],"wp:attachment":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/media?parent=1928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/categories?post=1928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/tags?post=1928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}