noatime – Disk I/O Optimizasyonu
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYlBEBOm' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
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 file system'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. Komut ve çıktısı şöyledir.
Not: Eğer FreeBSD ya da benzeri bir unix türevi kullanıyorsanuz komut
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ı mail 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 mail 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, Redhat 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 komut şö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 RedHat 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/nfs/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
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
Trackbacks
Yorumda bulunun.
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]