İç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

Loading