Oracle mechanics

20.04.2013

ssd smart flash cache

Документация Oracle 11.2 рекомендует использовать технологию smart flash cache при совпадении следующих условий:

  • Ваша бд работает только на [правильных] операционных системах Solaris или Oracle Linux [хороший ход, в действительности конечно же flash cache может быть использован и на других клонах RedHat Linux: RHEL, Fedora, CentOS — нетрудно узнать как это сделать у Surachart Opun, например]
  • Если из секции Buffer Pool Advisory (AWR) следует, что удвоение buffer cache крайне желательно [другими словами, ввод-вывод блоков бд заметно ограничивает общую производительность системы]
  • db file sequential read находится в топе событий ожидания [точнее, эта рекомендация относится ко всем ожиданиям ввода-вывода блоков бд: db file sequential read, db file scattered read, db file parallel read]
  • В системе достаточно свободного процессорного ресурса

Почти в полном соответствии с рекомендациями некоторое время назад совместно с Дмитрием Якубеней добавили smart flash cache в виде отдельной ASM DiskGroup / normal redundancy / 2 x Intel 320 series SSD / %Overprovisioning 50%, т.е. из пары 300GB дисков получилось 135 честных GB flash cache памяти:

11.2.0.3@ SQL> @param db_flash_cache_size

NAME                VALUE        DSC
------------------- ------------ ----------------------------------------
db_flash_cache_size 144955146240 flash cache size for db_flash_cache_file

Добавляли в, по большей части, отчётную бд с постоянно обновляемым контентом в виде Materialized Views (средне-генерируемый Redo size ~ 5-6MB/sec), использующую ~ 40GB буферов бд, что опять же соответствует рекомендациям по соотношению добавляемого flash cache и буферного кэша SGA — от 2-х до 10-ти раз:

SQL> select bytes/1024/1024/1024 as "GB" from v$sgastat where name = 'buffer_cache';

GB
----------
41,375

и постоянно испытывавшую некоторый дефицит ресурсов дискового ввода вывода:

Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                           Avg
                                                          wait   % DB
Event                                 Waits     Time(s)   (ms)   time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
db file scattered read            1,379,087      14,010     10   42.2 User I/O   -- ввод-вывод блоков бд
DB CPU                                            8,837          26.6
direct path read                    154,203       2,851     18    8.6 User I/O
db file sequential read             234,808       1,651      7    5.0 User I/O   -- ввод-вывод блоков бд
SQL*Net message from dblink          17,512       1,293     74    3.9 Network    -- типичное ожидание для этой системы

Сразу после конфигурации и добавления flash cache при сравнимой нагрузке топ ожиданий стал выглядеть таким образом:

Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                           Avg
                                                          wait   % DB
Event                                 Waits     Time(s)   (ms)   time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
db flash cache multiblock phys    1,593,881       2,887      2   21.9 User I/O
direct path read                    112,319       2,496     22   18.9 User I/O   -- без изменений
DB CPU                                            2,480          18.8
SQL*Net message from dblink           4,484         320     71    2.4 Network
direct path read temp                40,388         245      6    1.9 User I/O
  • ожидания db file scattered read / db file sequential read, в основном, сменились на db flash cache multiblock physical read / db flash cache single block physical read
  • общее время ожиданий ввода-вывода сократилось не менее чем в 5 раз — однозначно-положительный результат

Утилизация SSD дисков на уровне ОС при значительной нагрузке на чтение и соответствующей настройке выглядела очень неплохо:

Device:         rrqm/s   wrqm/s     r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sdc1              0.00     0.00 6568.00  0.50   102.63     0.00    32.00     8.39    1.28   0.12  76.75
sdd1              0.00     0.00 6468.50  0.50   101.07     0.00    32.00     8.28    1.28   0.12  76.15

Традиционные ожидания ввода-вывода конечно же не исчезли, но их количество сократилось более чем на порядок (далее идут данные из другого AWR, с меньшей нагрузкой):

Foreground Wait Events

                                                                            Avg
                                                       %Time Total Wait    wait    Waits   % DB
Event                                            Waits -outs   Time (s)    (ms)     /txn   time
----------------------------------------- ------------ ----- ---------- ------- -------- ------
...
db flash cache multiblock physical read        391,185     0        604       2     81.6    1.8
db file scattered read                          35,170     0        568      16      7.3    1.6
...
db file sequential read                         11,549     0        171      15      2.4     .5
db flash cache single block physical read      226,299     0        145       1     47.2     .4

Диаграммы ожиданий чтения из db flash cache — ровные (возможно, из-за небольшой нагрузки, хотя можно видеть точно такое же ср.время ожидания db flash cache multiblock physical read ~ 2мс и для нагруженной системы — в первом AWR):

Wait Event Histogram
                                          Total
Event                                     Waits  1s
db flash cache multiblock physical read   391.2  37.2  41.5  19.5   1.3    .4    .0    .0
db flash cache single block physical read 221.8  92.8   5.6   1.4    .2    .0    .1    .0

Статистики отражают некоторые детали механизма работы db flash cache:

Statistic
                                              Total     per Second     per Trans
flash cache eviction: aged out              207,168           57.5          43.2
flash cache eviction: invalidated           147,321           40.9          30.7 -- блоки перестали быть current ?
flash cache insert skip: DBWR overloaded          0            0.0           0.0 -- контроль/забота о состоянии DBWR
flash cache insert skip: exists           8,104,239        2,248.2       1,690.1 -- не совсем понятно для чего DBWR пытался повторно сбросить неизменённые current блоки ?
flash cache insert skip: modification            74            0.0           0.0 -- ?
flash cache insert skip: not current             70            0.0           0.0 -- во flash cache пишутся только current блоки
flash cache insert skip: not useful          78,809           21.9          16.4 -- ?
flash cache inserts                         866,093          240.3         180.6
...
physical read flash cache hits            7,901,019        2,191.8       1,647.8 -- фактическая экономия физических чтений

Статистика заполнения кэша:

SQL> select status, count(*) from v$bh group by status order by count(*) desc;

STATUS       COUNT(*)
---------- ----------
flashcur      8752021 -- размер используемого flash cache ~ 133.5 MB при 16к блоке
xcur          2377590
cr             170605
free            43784

Ожидание write complete waits: flash cache блокируется процессами DBWR и встречается редко, что, вероятно, связано с низкой OLTP активностью и достаточным количеством процессов DBWR в системе:

SQL> @ash_wait_tree_hist "event = 'write complete waits: flash cache'" "" ""

LVL INST_ID BLOCKING_TREE  SQL_OPNAME  EVENT                             WAITS_COUNT SESS_COUNT AVG_WA
--- ------- -------------- ----------- --------------------------------- ----------- ---------- ------
1       1 FOREGROUND     DELETE      write complete waits: flash cache          35         20   1118
1       1 FOREGROUND     UPDATE      write complete waits: flash cache          13         11    869
1       1 FOREGROUND     INSERT      write complete waits: flash cache           9          9    644
1       1 FOREGROUND                 write complete waits: flash cache           2          2   1098
2       1   (DBW1)                   On CPU / runqueue                          22          1      0
2       1   (DBW2)                   On CPU / runqueue                          19          1      0
2       1   (DBW0)                   On CPU / runqueue                          17          1      0
2       1   (DBW2)                   db file parallel write                      1          1     94

Добавить комментарий »

Комментариев нет.

RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Создайте бесплатный сайт или блог на WordPress.com.

%d такие блоггеры, как: