Fakir Sistemcinin Performans Hesabı

Kenanerdey
Turk Telekom Bulut Teknolojileri
4 min readJan 17, 2022

Merhabalar,

Ekonomik sorunların gündemde olduğu bir dönemde temel gıdaları temin edemezsek ne yaparız korkusuyla bir çok insan evinde stok yaptı. Herkes fazla fazla un, süt, peynir, makarna stokladı. Ya sistem adminleri olarak bizler kullandığımız toollar, izleme araçları olmasa ne yaparız hiç düşündünüz mü? Biz de tool mu stoklayalım? :)

Tabii ki bu mümkün olmadığı için basit yöntemlerle performans analizlerini nasıl yaparız ona bakacağız. Zamanında (taa sistem admini iken) bu konuyla alakalı olarak yazdığım ve aldığım notları paylaşmak istedim. Belki bir fikir uyandırabilir. Bu bilgilerde güncellenme ihtiyacı varsa da benim gibi bir sistem admini amcasına konuyu bildirirsiniz deyip alta yazıyorum.

Eğer elimizde performans metriklerini ölçecek gelişmiş araçlar olmasaydı basit komutlarla nasıl hesap yapardık ? Yazının başlığının fakir olarak başlamasının nedeni bu. Elimizdeki 2 adet komutla bunu göstermek. Baştan bir konuyu belirtmekte fayda var. Burada yapacağımız hesaplar tamamen doğruyu vermeyebilir. Kullanacağımız komutların işletim sistemlerine göre implementasyonları farklılık gösterebileceğinden iki farklı tür arasında yapacağımız karşılaştırma elma ile armutun karşılaştırmasına benzeyebilir. Aynı işletim sistemleri arasındaki karşılaştırmalar daha doğru sonucu verebilir. Uyarımızı verdikten sonra konuya başlayabiliriz.

Kullanacağımız komut dd. Dd komutu belirtilen bir kaynaktan veriyi okuyan(if parametresi ile) başka bir hedefe(of parametresi) veriyi yazan bir komut. Aklınıza gelmeyecek şeyleri dd ile yapabilirsiniz. Mesela bir dökümandaki harfleri büyük harfe çevirmek mümkün bu komutla. O yüzden aşağıdaki linke bir bakın derim.

http://en.wikipedia.org/wiki/Dd_%28Unix%29

Komutla verilen bs parametresi ile aktarılacak veri bloğunun size ı, count sayısı ile kaç adet blok aktarılacağı belirtiliyor. Bu bilgiler ışığında fakir bir sistemci olarak elimizdekiyle ne yapabiliriz buna bakalım. Başlıklara böldüm biri ilginizi çekmezse diğerine bakabilirsiniz.

  1. İşlemci hızı, önbellek ve core lar arası veri transfer hızı

Aşağıdaki komut bunun için kullanılabilir.

timex dd if=/dev/zero bs=64k count=50000 | gzip -9 | dd of=/dev/null

Yalnız bu komutu tek core lu sunucularda çalıştırmamız daha anlamlı. Zira ikinci dd komutu farklı işletim sistemlerinde farklı core lar üzeinde çalıştırılabilir. Bu kararı işletim sistemine bırakmamak için kullandığımız komutu biraz zenginleştirdim. Bir script içerisine yerleştirdim.

#cat test_cpu.sh
input () {
mpsched -f -c $1 dd if=/dev/zero bs=64k count=500000
}
output () {
mpsched -f -c $1 dd of=/dev/null bs=64k count=500000
}
input $1 | output $2

# timex ./test_cpu.sh 0 0

Bu script HP-UX için yazıldı. 0 nolu core ile 0 nolu aynı core arasında aktarım yapıyor. Bunu solariste denemek için mpsched yerine psrset, Linux için taskset yazmanız gerekiyor. Bu komutlar verilen komutu belli bir core üzerinde çalıştırmaya yarıyor. Bu sayede aynı core lar arası, aynı soket içinde farklı core lar arası ve farklı soket ler arası hızı ölçebilirsiniz. AIX prebinding yapamadığından sadece tek core üzerinde test yapmak daha anlamlı. Bu yüzden AIX için sadece aynı core üzerinde çalıştırdığım sonuçları gönderiyorum.

Intel Xeon 5600
Aynı Core : 0.71
Aynı socket:1.741
Farklı socket:3.034
Itanium 9340s
Aynı Core: 0.38
Aynı Socket: 0.87
Farklı Socket:0.88
Power6
Aynı Core : 1.60

Power’in şaşırtılacak derece düşük çıkması ilginç. Gerçi eski nesil işlemci ama bundan başka yorum getirebilen varsa gelsin

2. Memory transfer hızı

Burda input file olarak /dev/mem i kullanıyoruz. Unixler bu dosyayı okumaya izin vermiyorken Linux da deneyebiliyoruz.

# time dd if=/dev/mem bs=64k of=/dev/null
32768+0 records in
32768+0 records out
2147483648 bytes (2.1 GB) copied, 3.25102 s, 661 MB/s
real 0m3.256s
user 0m0.008s
sys 0m3.248s

farkındaysanız burada dd ile bir şeyi de yapabildiğimizi bulduk. Sunucu üzerindeki memory miktarı 2.1 GB mış

3. Bir diskin ne kadar I/O yaptığı ve I/Obant genişliği

Bu testte IBMDS4800 üzerinden Raid 10 olarak verilen arkada 22 fiziksel disk üzerine dağılan bir diski kullandım. Doğruluğunu gösterebilmek için Read Cache i storage üzerinden kapattım.

samarra:/#timex dd if=/dev/rdisk/disk14 bs=8k count=100000 of=/dev/null
100000+0 records in
100000+0 records out
real 22.69
user 0.07
sys 1.02

100000 io yaptık ve bunu 22.69 sn de tamamladı. Bu da 4407 IO/s yapıyor. 4407 yi 22 böldüğümüzde 200 IO/s yapıyor. Bu da 15K diskin yapabileceği IO miktarı.

Bu sefer başka bir disk, üzerinde Integrity/VM çalışan bir fiziksel host üzerine atandı. Bu diski aynı zamanda bu host üzerinde çalışan bir sanal sunucu da görüyor. Böylece hem fiziksel hem de sanal sunucudan test ederek, doğrudan erişim ve sanal sunucudan erişim arasındaki farkı da görmüş olacağız.

ivm host:
ivm1:/#timex dd if=/dev/rdisk/disk100 bs=8k count=10000 of=/dev/null
10000+0 records in
10000+0 records out
real 0.89
user 0.01
sys 0.14

Sanal sunucu:
canik:/#timex dd if=/dev/rdisk/disk3 bs=8k count=10000 of=/dev/null
10000+0 records in
10000+0 records out
real 1.91
user 0.02
sys 0.39

Görüldüğü üzere I/O Stack içerisine her bir katman eklendiğinde erişim süresi artıyor.

4. Sunucular arasındaki network hızı

En kolay ping ile ölçülebilir sanırım. Bu ölçüm, sunucu üzerindeki datayı gönderen ve alan yazılım, disk hızı, cpu v.s. gibi diğer etmenlerden bağımsızdır. Bant genişliği yerine efektif hızı verebilir. Fakat tam doğru sonuç vermeyebilir. Test edelim…

mesir:/tmp#ping 11.6.61.45 65500 -n 1
PING 11.6.61.45: 65500 byte packets
65500 bytes from 11.6.61.45: icmp_seq=0. time=3. Ms

65500 byte datanın network üzerinden gönderilmesi 3 ms sürdü.

65500 / 3 = 21833 KB/s = 21.3 MB/s

Şimdi ftp deneyelim.

sftp> mput myimage
Uploading myimage to /tmp/myimage
myimage 100% 426MB 28.4MB/s 28.9MB/s 00:15

--

--