İçindekiler
Performans testleri sırasında, sonuçları etkileyen birçok parametre vardır. Hardware özellikleri, (varsa) network hızı, işletim sistemi vs. Bir bütün olarak bütün bu parametreler önem kazanıyor.
İşte, bunlardan biri de harddisk okuma/yazma(disk I/O) hızıdır. Sonuçları iyi yorumlayabilmek adına, normal şartlarda diskin I/O değerlerini bilmemiz önemlidir.
Depolama satıcıları, ürünleri üzerinde sonsuz miktarda performans verisi sunar, ancak bilgiler, bir Oracle veritabanı tarafından kullanıldığında, depolamanın nasıl performans göstereceğini yansıtmaz. Burada, işletim sistemi seviyesinde ve Oracle tarafından sağlanan bazı yardımcı programlar da dahil olmak üzere depolama sistemlerinizin performansını test etmek için birkaç yoldan bahsedeceğiz.
NOT : Oracle araçları (utilities), Oracle veritabanı tarafından gerçekleştirilen işlem türlerini taklit etmek için benzetilmiş bir yük kullanır. Uygulamalarınızın ürettikleri performans seviyesini başarabileceklerinin garantisi yoktur.
Disk performans testleri, buffer ve gerçek disk hızı olarak ayrılmaktadır. Buffer ön belleğin verdiği tepki süresidir. Gerçek disk hızı ise, diskinizin fiziksel olarak yazma / okuma işlemlerine verdiği tepki süresidir. İşleme başlangıç süresi, işlemi bitirme süresi ve işlemin disk boyutu olarak kriterler bulunmaktadır.
Biz bu yazımızda disk performansını ölçmek için aşağıdaki araçları sırayla kullanacağız.
- dd
- hdparm
- ORION
- CALIBRATE_IO
dd komutu
Bir disk aygıtının Linux ve Unix benzeri bir sistemdeki yazma performansını izlemek için kullanılır.
Modern işletim sistemleri normalde derhal RAID sistemlerine veya sabit disklere dosya yazılmaz. Şu anda kullanımda olmayan temporary memory, yazma ve okumaları cache’e almak için kullanılacaktır. Bu nedenle I/O performans ölçümlerinde cacheden etkilenmeyecek şekilde yapılması daha doğru olur, bunuda dd komutunda oflag=dsync parametresi ile yapabiliriz.
[root@cloud-12c ~]# time sh -c "dd if=/dev/zero of=dd-test-file bs=8k count=1000000 oflag=dsync" 1000000+0 records in 1000000+0 records out 8192000000 bytes (8.2 GB) copied, 1532.25 s, 5.3 MB/s real 25m32.259s user 0m2.544s sys 4m8.520s
dd ile kullanılan ve kullanabileceğimiz parametereler aşağıdakiler gibidir;
- if : Verileri kopyalamak istediğiniz yerden bir kaynaktır ve ‘if^’, ‘input file’ anlamına gelir
- of :Veriyi yazmak/yapıştırmak istediğiniz yerdir ve ‘of’, ‘output file’ anlamına gelir
- bs : block boyutudur. Blok boyutunu belirtmezseniz, dd varsayılan bir blok boyutunu 512 bayt kullanır
- count : bs ile boyutları belirtilen bloklardan kaç adet kopyalanacağı
- oflag = dsync (oflag=dsync): Veriler için senkronize I/O kullanın. Bu seçenek vmfs önbelleğe alma işleminden kurtulmanızı sağlar ve size iyi ve doğru sonuçlar verir
- conv = fdatasyn: Yine, bu, dd’ye çıkmadan hemen önce bir kez tam bir “senkronizasyon” gerektirmesini söyler. Bu seçenek oflag = dsync’e eşdeğerdir.
[root@cloud-12c ~]# time sh -c "dd if=/dev/zero of=dd-test-file bs=8k count=1000000 && sync" 1000000+0 records in 1000000+0 records out 8192000000 bytes (8.2 GB) copied, 72.5792 s, 113 MB/s real 1m24.157s user 0m0.393s sys 0m28.039s [root@cloud-12c ~]# ls -ltrh dd-test-file -rw-r--r--. 1 root root 7.7G Jan 30 15:48 dd-test-file
Linux sistemler üzerinde iki farklı çeşit okuma özelliği mevcuttur. Birincisi disk üzerinde yapılan ve tekrarlanan işlemlerin daha hızlı tekrarlanması açısından ön belleğe (buffer) alınıp, bellekten daha hızlı okunmasıdır. Diğer ikinci bir okuma işlemi ise fiziksel diskimize yazılan verilerin okunması işlemidir.
[root@cloud-12c ~]# dd if=dd-test-file of=/dev/null bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 0.535511 s, 2.0 GB/s
Yukardaki komutu verdikten sonra çıktısı aşağıdaki gibi olabilir en sonda yer alan 2.0 GB/s sizin diskinizin saniyede okuyabildiği ön bellek miktarıdır.
Linux sunucular üzerinde diskinizin fiziksel (gerçek) olarak okuma hızını ölçmek için aşağıdaki komutları sırasıyla vermeniz yeterlidir.
/sbin/sysctl -w vm.drop_caches=3 [root@cloud-12c ~]# dd if=dd-test-file of=/dev/null bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 3.27164 s, 328 MB/s
Sunucumuz saniyede 328 MB okuyabilmektedir.
hdparm
Hdparm ile de aşağıdaki gibi disk I/O’yu ölçeriz.
hdparm -Tt /dev/sda /dev/sda: Timing cached reads: 16924 MB in 2.00 seconds = 8469.95 MB/sec Timing buffered disk reads: 1386 MB in 3.00 seconds = 461.50 MB/sec
ORION
ORION (Oracle IO Numbers), Oracle veritabanları tarafından gerçekleştirilen I/O türünü taklit eder; bu da, Oracle’ı yüklemeden depolama sistemleri için I/O performansını ölçmenize olanak tanır. OTN’den çok sayıda platform için indirmeye hazırdı, ancak bu indirme işlemi artık mümkün değil. Bunun yerine, Grid Infrastructure (GI) ve veritabanı kurulumlarının “$ORACLE_HOME/ bin” dizinine dahil edildi.
Kullanım bilgileri aşağıdaki komutla görüntülenir.
$ORACLE_HOME/bin/orion -help
Testi yapmak için Oracle için kullanacağınız LUN’ları bilmeniz gerekir.
mkdir /luns dd if=/dev/zero of=/luns/lun1 bs=1024k count=10 dd if=/dev/zero of=/luns/lun2 bs=1024k count=10 dd if=/dev/zero of=/luns/lun3 bs=1024k count=10 dd if=/dev/zero of=/luns/lun4 bs=1024k count=10
Ardından, LUN yapılandırmasını tutmak için bir dosya oluşturun. Dosyanın geçerli dizinde mevcut olduğu varsayılmaktadır.
cat ob-test.lun /luns/lun1 /luns/lun2 /luns/lun3 /luns/lun4
Sonra test yapacağız. Bir dizi küçük I/O işleminin (8K) performansını, büyük I/O işlemlerinin (1M) ile karşılaştırmak için tam bir grid testi yapacağım. Çalışmayı “normal” seçeneğini kullanarak yapmak uzun zaman alabilir, bu yüzden önce “basic” seçeneğini kullanmayı deneyebilirsiniz.
$ORACLE_HOME/bin/orion -run normal -testname ob-test ORION: ORacle IO Numbers -- Version 12.1.0.2.0 ob-test_20140828_1804 Calibration will take approximately 190 minutes. Using a large value for -cache_size may take longer. Maximum Large MBPS=1672.01 @ Small=0 and Large=2 Maximum Small IOPS=16262 @ Small=13 and Large=1 Small Read Latency: avg=796 us, min=111 us, max=4927 us, std dev=254 us @ Small=13 and Large=1 Minimum Small Latency=148 usecs @ Small=1 and Large=0 Small Read Latency: avg=148 us, min=0 us, max=82630 us, std dev=209 us @ Small=1 and Large=0 Small Read / Write Latency Histogram @ Small=1 and Large=0 Latency: # of IOs (read) # of IOs (write) 0 - 1 us: 18 0 2 - 4 us: 0 0 4 - 8 us: 0 0 8 - 16 us: 3 0 16 - 32 us: 4 0 32 - 64 us: 5 0 64 - 128 us: 64513 0 128 - 256 us: 325674 0 256 - 512 us: 5759 0 512 - 1024 us: 139 0 1024 - 2048 us: 21 0 2048 - 4096 us: 3 0 4096 - 8192 us: 1 0 8192 - 16384 us: 0 0 16384 - 32768 us: 1 0 32768 - 65536 us: 0 0 65536 - 131072 us: 3 0 131072 - 262144 us: 0 0 262144 - 524288 us: 0 0 524288 - 1048576 us: 0 0 1048576 - 2097152 us: 0 0 2097152 - 4194304 us: 0 0 4194304 - 8388608 us: 0 0 8388608 - 16777216 us: 0 0 16777216 - 33554432 us: 0 0 33554432 - 67108864 us: 0 0 67108864 - 134217728 us: 0 0 134217728 - 268435456 us: 0 0 #
Testin tamamlanmasının ardından, ORION çalıştırılabilir dizininin bulunduğu dizin, her test için toplanan IOPS, MBPS ve gecikme hakkında bilgiler içeren birkaç yeni dosya içerecektir. İşte bu çalışma tarafından üretilen dosyalar.
ob-test_20140828_1804_summary.txt ob-test_20140828_1804_iops.csv ob-test_20140828_1804_mbps.csv ob-test_20140828_1804_lat.csv ob-test_20140828_1804_trace.txt ob-test_20140828_1804_hist.txt
DBMS_RESOURCE_MANAGER.CALIBRATE_IO
Oracle Database 11g Sürüm 1’de sunulan CALIBRATE_IO prosedürü, Oracle’ın içinden depolama sisteminin yetenekleri hakkında bir fikir verir. Prosedürle ilgili birkaç kısıtlama var.
- Prosedür, SYSDBA ayrıcalığına sahip bir kullanıcı tarafından çağrılmalıdır.
- TIMED_STATISTICS true olarak ayarlanmalıdır, varsayılan olarak STATISTICS_LEVEL TYPICAL olarak ayarlanır.
- Data file lara, asynchronous I/O kullanarak erişilmesi gerekir. ASM kullanıldığında varsayılan değer budur.
Aşağıdaki sorgu kullanarak mevcut asenkron I / O ayarlarınızı veri dosyalarınız için kontrol edebilirsiniz.
SELECT d.name, i.asynch_io FROM v$datafile d, v$iostat_file i WHERE d.file# = i.file_no AND i.filetype_name = 'Data File'; NAME ASYNCH_IO -------------------------------------------------- --------- /u01/app/oracle/oradata/DB11G/system01.dbf ASYNC_OFF /u01/app/oracle/oradata/DB11G/sysaux01.dbf ASYNC_OFF /u01/app/oracle/oradata/DB11G/undotbs01.dbf ASYNC_OFF /u01/app/oracle/oradata/DB11G/users01.dbf ASYNC_OFF /u01/app/oracle/oradata/DB11G/example01.dbf ASYNC_OFF
Asynchronous I/O’yu açmak için aşağıdaki komutu verin ve veritabanını yeniden başlatın.
ALTER SYSTEM SET filesystemio_options=setall SCOPE=SPFILE;
Depolama biriminizin asynchronousI/O’yu desteklemesi koşuluyla, ASYNC_IO bayrağı şimdi değişmiş olmalıydı.
SELECT d.name, i.asynch_io FROM v$datafile d, v$iostat_file i WHERE d.file# = i.file_no AND i.filetype_name = 'Data File'; NAME ASYNCH_IO -------------------------------------------------- --------- /u01/app/oracle/oradata/DB11G/system01.dbf ASYNC_ON /u01/app/oracle/oradata/DB11G/sysaux01.dbf ASYNC_ON /u01/app/oracle/oradata/DB11G/undotbs01.dbf ASYNC_ON /u01/app/oracle/oradata/DB11G/users01.dbf ASYNC_ON /u01/app/oracle/oradata/DB11G/example01.dbf ASYNC_ON 5 rows selected.
Şimdi aşağıdaki kodu çalıştırarak prosedürü çağırabilirsiniz.
CONN / AS SYSDBA SET SERVEROUTPUT ON DECLARE l_latency PLS_INTEGER; l_iops PLS_INTEGER; l_mbps PLS_INTEGER; BEGIN DBMS_RESOURCE_MANAGER.calibrate_io (num_physical_disks => 1, max_latency => 20, max_iops => l_iops, max_mbps => l_mbps, actual_latency => l_latency); DBMS_OUTPUT.put_line('Max IOPS = ' || l_iops); DBMS_OUTPUT.put_line('Max MBPS = ' || l_mbps); DBMS_OUTPUT.put_line('Latency = ' || l_latency); END; / Max IOPS = 95 Max MBPS = 449 Latency = 20 PL/SQL procedure successfully completed.
Ekranda görünmeye ek olarak, calibration çalışmasının sonuçları DBA_RSRC_IO_CALIBRATE viewi kullanılarak görüntülenebilir.
SET LINESIZE 100 COLUMN start_time FORMAT A20 COLUMN end_time FORMAT A20 SELECT TO_CHAR(start_time, 'DD-MON-YYY HH24:MI:SS') AS start_time, TO_CHAR(end_time, 'DD-MON-YYY HH24:MI:SS') AS end_time, max_iops, max_mbps, max_pmbps, latency, num_physical_disks AS disks FROM dba_rsrc_io_calibrate; START_TIME END_TIME MAX_IOPS MAX_MBPS MAX_PMBPS LATENCY DISKS -------------------- -------------------- ---------- ---------- ---------- ---------- ---------- 20-JUL-010 18:07:21 20-JUL-010 18:13:55 95 449 461 20 1
https://kevinclosson.net/2012/02/06/introducing-slob-the-silly-little-oracle-benchmark/
https://oracle-base.com/articles/misc/measuring-storage-performance-for-oracle-systems
https://www.databasejournal.com/features/oracle/oracles-calibrateioprocedure-why-youshould-use-it.html
https://www.cyberciti.biz/faq/howto-linux-unix-test-disk-performance-with-dd-command/
Mustafa Bektaş Tepe
İyi Çalışmalar