Ana Sayfa » *nix » noatime – Disk I/O Optimizasyonu

noatime – Disk I/O Optimizasyonu


BerbatKötüİdare EderGüzelHarika (Toplam 1 oy. 5 puan üzerinden ortalama 5,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

Eğer üzerinde yoğun disk işlemi bulunduğundan ve bu yüksek I/O nedeni ile performans sorunları yaşadığınız bir *nix tabanlı sunucunuz varsa, disk optimizasyonu yaparak I/O'dan tasarruf etmek için yapabileceğiniz şeylerin başında disklerinizi sisteme noatime seçeneği ile mount etmektir.

Noatime Ne İşe Yarar?


Bilindiği gibi *nix tabanlı işletim sistemleri 'da bulunan her bir dosya için ctime,mtime ve atime olmak üzere 3 adet tarih bilgisi tutarlar. ctime dosyanın oluşturulma tarihini, mtime dosyanın değiştirilme tarihini ve son olarak atime ise dosyaya en son erişimin yapıldığı tarihi belirtir.

Bu değerleri stat komutunu kullanarak görebilirsiniz. ve çıktısı şöyledir.

Not: Eğer ya da benzeri bir Unix türevi kullanıyorsanuz
stat -x testdosyaadi olmalıdır.

[root@tstcnt]# stat testdosyasi
File: `testdosyasi'
Size: 2197            Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 590838      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2008-12-19 22:06:00.000000000 +0200
Modify: 2008-11-17 10:35:04.000000000 +0200
Change: 2008-11-17 10:35:04.000000000 +0200

Normal olarak, sistemdeki herhangi bir dosyada okuma işlemi yapıldığı zaman inod access time olarak geçen atime değeri update edilir; dolayısı ile sistemde yapılan tüm read işlemleri için bir de write işlemi yapılmak durumundadır. Bu nedenledir ki disk konusunda performans optimizasyonu için yapılabilecek ayarlardan biri de atime özelliğini devre dışı bırakmaktır.

Dezavantajları


Ancak bu noktada sisteminizde atime değerine ihtiyaç duyan herhangi bir yazılım çalışıp çalışmadığına dikkat etmeniz gerekiyor. Örneğin bazı araçları bir mailin okunup okunmadığını anlamak için atime değerinden yararlanıyorlar (Bkz: Mutt). Ancak sunuculardan bahsettiğimiz ve bir sunucuda herhangi bir client gereksinimi söz konusu olmadığından bu konuda çok endişelenmenize gerek yok. Ayrıca, mesela Mutt'un bir mailin okunup okunmadığına karar verebilmesi için atime değerini kullanması yerine dosya ebatından bu çıkarımı yapması sağlanabiliyormuş.

Bunun dışında, gibi bazı Linux dağıtımlarında atime değerini kullanarak belirli periyodlarda geçici dosyaların tutulduğu /tmp dizini temizleyen tmpwatch isimli bir araç bulunuyor. Dolayısı ile sisteminizde tmpwatch kullanılıyorsa bu araç için de atime özelliğini devre dışı bırakmak gerekiyor. Bunun nasıl yapıldığını biraz aşağıda bulabilirsiniz.

Ek bilgi olarak, Linux tabanlı sistemler için noatime yerine kullanılabilecek relatime isimli bir özellik daha bulunuyor. Bu özellik atime değerini her erişimden sonra update etmek yerine dosyanın o anki atime değeri, mtime ya da ctime'dan eski ise atime'ı update ediyor. Ancak ben bunu şu ana kadar hiç kullanmadım.

Disklerin Noatime İle Mount Edilmesi


Noatime ile atime özelliğini devre dışı bırakmak oldukça basit.

Sistemi reboot etmeye gerek kalmadan noatime'ı devreye almak için aşağıdaki adımlar takip edilebilir.

Sisteminiz FreeBSD ise:

Örneğin, /usr disk bölümünde atime özelliğini devre dışı bırakmak için örnek şöyledir.

root@tstbsd]# mount -u -o rw,noatime /usr

Bu işlemden sonra mount komutu ile duruma baktığınız zaman aşağıdaki gibi bir çıktı almanız gerekir.

root@tstbsd]# /dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/da0s1d on /tmp (ufs, local, soft-updates)
/dev/da0s1e on /usr (ufs, local, noatime, soft-updates)
/dev/da0s1f on /var (ufs, local, soft-updates)

Gördüğünüz gibi /usr dizini noatime değeri ile remount edilmiş bulunuyor.

İşlemi geri almak isteseniz aşağıdaki gibi atime değeri ile yeniden remount edebilirsiniz.

root@tstbsd]# mount -u -o rw,atime /usr

Sisteminizi ilk reboot ettiğiniz zaman mount işlemi /etc/fstab dosyası referans alındığı ve ilgili değer orada bulunmadığı için ayarlar eski haline dönecektir. Disk bölümünün açılışlarda otomatik olarak noatime ile mount edilmesi için fstab dosyanızı açın:

root@tstbsd]# vi /etc/fstab

ve ilgili disk partisyonuna ait satıra aşağıdaki gibi noatime değerini ekleyin ve dosyayı kaydederek çıkın.

/dev/da0s1b             none            swap    sw              0       0
/dev/da0s1a             /               ufs     rw              1       1
/dev/da0s1d             /tmp            ufs     rw              2       2
/dev/da0s1e             /usr            ufs     rw,noatime      2       2
/dev/da0s1f             /var            ufs     rw              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0

Böylece artık sistem açılırken de ilgili disk bölünü noatime ile mount edilecektir.

Sisteminiz Linux Tabanlı ise:

mount işlemleri Linux tabanlı işletim sistemlerinde biraz farklıdır. Örneğin türevlerinin default kurulumlarında FreeBSD örneğindeki gibi /usr /var vs. dizinleri birer partition olarak tanımlanmaz. Onun yerine -aksini belirtmediyseniz- Logical Volume Group altında tek bir / (root) partisyonu bulunur. /var /usr vs. gibi sistem dizinleri bu kök dizin altında bulunur.

Dolayısı ile sadece belirli dizinlerde atime'ı devre dışı bırakmak için mount komutu yerine chattr komutu kullanılmaktadır.

root@tstcnt]# chattr -R +A /usr

Geri almak içinse -chattr -R -A /usr

Ancak eğer tüm / (root)'ta atime'ı devre dışı bırakmak istiyorsanız mount komutunu kullanabilirsiniz. Ayrıca, sisteminizde ikinci bir disk daha varsa ilgili diske ait mount pointi de noatime ile remount edebilirsiniz. Ayrıca linux'larda nodiratime isimli bir özellik daha bulunmaktadir ki noatime'ın yaptığı işin aynısını dizinler için de yapmaktadır.

Her iki özelliği de kullanarak örneğin / (root)'u noatime ile remount edelim.

Fstab dosyasını açın

root@tstcnt]# vi /etc/fstab

ve örnekte olduğu gibi / için noatime özelliğini opitions bölümünde belirtin.

/dev/VolGroup00/LogVol00 /             ext3    defaults,noatime,nodiratime       1 1
LABEL=/boot             /boot          ext3    defaults        1 2
tmpfs                   /dev/shm       tmpfs   defaults        0 0
devpts                  /dev/pts       devpts  gid=5,mode=620  0 0
sysfs                   /sys           sysfs   defaults        0 0
proc                    /proc          proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap          swap    defaults        0 0

Şimdi, diski sisteme yeniden bağlayın

root@tstcnt]# mount -o remount /

Herşey yolunda gittiyse mount komutu ile durumu kontrol edebilirsiniz.

root@tstcnt]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,noatime,nodiratime)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib//rpc_pipefs type rpc_pipefs (rw)

Mount işlemleri ile ilgili olrak herşey bundan ibaret ancak sisteminizde tmpwatch varsa, sisteminizi noatime değeri ile mount ettiğiniz için bu aracın atime yerine mtime'ı kullanması için bir düzenleme yapmanız gerekiyor.

tmpwatch dosyasını editleyin

root@tstcnt]# # vi /etc/cron.daily/tmpwatch

Dosyanın içerisinde geçen /usr/sbin/tmpwatch -f 720 “$d” satırına –mtime değerini ekleyin.

İçeriği aşağıdaki gibi olmalıdır.

/usr/sbin/tmpwatch -x /tmp/.X11-unix -x /tmp/.XIM-unix -x /tmp/.font-unix \
        -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp
/usr/sbin/tmpwatch 720 /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch --mtime -f 720 "$d"
    fi
done

Kaydedip çıkın. Artık tmpwatch /tmp dizinini temizlemek için atime'a değil mtime'a bakacak. Normal şartlarda tmp dizininizin şişmemesi gerekir.

Kaynaklar:
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise…./
http://lwn.net/Articles/244829/
http://kerneltrap.org/node/14148
http://lwn.net/Articles/244941/
http://www.howtoforge.com/reducing-disk-io-by-mounting-partitions-with-noatime

Visited 560 times, 1 visit(s) today
Kategoriler: *nix |

Bu yazılar da ilginizi çekebilir:


- Daily Security Cron Job ve Disk I/O Yoğunluğu.
- FreeBSD Sistemlerde RamDisk Oluşturulması
- FreeBSD NFS Server ve Client Yapılandırması
- iotop İle Disk Aktivitesini Görüntülemek | I/O Monitoring
- VMware Linux Guestlere Sistemi Reboot Etmeden Disk Eklemek

Yorumlar


  1. Alican Cakil | (Aralık 22nd, 2010 2:50 am)

    Merhaba,

    WebHosting sunucu uzerinden konusursak, komple bir diski mount etmek yerine, en cok islem yapilan MySQL dizini ve home dizininde bu komutu calistirmak yeterli gibi

    chattr -R +A /home
    chattr -R +A /var/lib/mysql

    Tabi tercih meselesi, bunu tercih etmemin sebebi, elimi ne zaman tmp klasoru ile alakali birseye sursem, elimde kalmasi.

    bilgi icin cok tesekkur ederim Cagri.

    [Cevapla]

Trackbacks

Yorumda bulunun.