VMware Workstation. Отключение кэша на запись и чтение.

Для правильных тесто IO на VMware Workstation, насколько это возможно конечно ввиду виртуализации, нужно выполнить:

1. Добавить эти параметры в vmx виртуалки:

disk.hostBuffer = "disabled"
hard-disk.useUnbuffered = "true"
aiomgr.unbuf = "TRUE"

2. Отключить кэш на запись в хостовой ОС.

                В среде Windows 10 кэш на запись отключается в диспетчере устройств ->Дисковые устройства. Выберем свойство диска, вкладка «Политика».

Под правильными тестами IO, я имею ввиду получения адекватного латенси от дисков, как на чтение так и на запись при устоявшейся нагрузке. Не отключив кэш на запись, результаты тестов будут не воспроизводимыми, ввиду того, что кэш на запись всё время всё портит.  

SMON. Slow Rollback of Dead Transactions

Проблема: Имеется мёртвая(Dead) транзакция которая откатывается со скоростью 1-2 блока в секунду, которая блокирует выполнение update/delete/insert с ожиданием transaction(event#=1074, name=transaction). Версия Oracle: 19.21.

Т.к. откат транзакции может занять значительное время, самое время как то помочь этому процессу. Для этого, нужно дропнуть обьект, с которым связана транзакция из-за которого откат идёт очень медленно. Как определить объект который нужно дропунуть? Вот тут всё может быть не однозначно, т.к. в транзакции может быть замешано N таблиц. В моём случае я включил трассировку 10046 для процесса SMON, в которой были ожидания вида ‘enq: CR — block range reuse ckpt’ obj#=МойПроблемныйОбъект, далее я сдампил ещё заголовок undo сегмента(alter system dump undo header «_ИмяСегмента») и ундо блоки связанные с транзакцией (alter system dump undo block «_ИмяСегмента» XID номер_USN номер_SLT номер_SEQ).

Откуда, что берём:

USN, SLT,SEQ-  из select * from v$fast_start_transactions
_ИмяСегмента- из Select * from v$rollname where usn = USN

В дампе блоков связанных с транзакцией кучи вот такого:

KTSL - LOB Persistent Undo Block (PUB) undo record.

Есть подозрения, что KTSL это -Kernel Transaction Segment LOB, но это не точно. В дампе заголовка ундо и в дампе блоков связанных с транзакцией, должна быть связь в виде: в заголовке ундо сегмента в разделе TRN TBL, в колонке cmt есть значение 0, а в колонке dba на этом же уровне, имеются координаты блока, сдампив который, мы попадём в UBA, который связан с alter system dump undo block «_ИмяСегмента» XID номер_USN номер_SLT номер_SEQ.

Нужно взять книжку Oracle Core от Jonathan Lewis, и ещё раз перечитать....

Проанализировав кучу текста, выбираем нужный обьект и дропаем))):

alter system set "_smu_debug_mode"=1024;
oradebug setospid <ospid of SMON process> 
oradebug event 10513 trace name context forever, level 2
drop table owner.table purge;
purge recyclebin;
oradebug event 10513 trace name context off
alter system set "_smu_debug_mode"=0;

Так же, я использовал fast_start_parallel_rolback=false;(переключение этого параметра может остановить процесс отката, тут либо инстанс перезапускать, либо пытаться оживить SMON).

Откат транзакции ускорится в сотни раз. Как завершится, создаём таблицу по новой.

Полезные ноты:

Database Hangs Because SMON Is Taking 100% CPU Doing Transaction Recovery (Doc ID 414242.1)
IF: Transaction Recovery or Rollback of Dead Transactions (Doc ID 1951738.1)

Отдельно хочу отметить:

Bug 11790175 — SMON spins in rollback of LOB due to double allocated block like bug 11814891 (Doc ID 11790175.8)

Это древний баг, описание которого в моём случае совпадает только по двум критериям:

  1. Медленный откат
  2. Проблемный объект: LOB

UNDO и REDO, тяжелая тема… возможно есть метод и попроще.

ORA-00800: soft external error, arguments: [Set Priority Failed]. Dism(128). Oracle 19c

Коротенькая заметка про очередные грабли, всплывшие где-то с 19.16, но так-же существуют в плоть до 19.22.

Дано:

Oracle: 19.22

OS: Oracle Linux Server release 8.3

Kernel: 5.4.17-2011.7.4.el8uek.x86_64

При старте БД наблюдаем в алерт логе такую картину:

Starting background process VKTM
Errors in file /oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_vktm_61290.trc  (incident=146927):
ORA-00800: soft external error, arguments: [Set Priority Failed], [VKTM], [Check traces and OS configuration], [Check Oracle document and MOS notes], []
Incident details in: /oracle/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_146927/orcl_vktm_61290_i146927.trc
Error attempting to elevate VKTM's priority: no further priority changes will be attempted for this process


Starting background process LGWR
Errors in file /oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_lgwr_61456.trc  (incident=147055):
ORA-00800: soft external error, arguments: [Set Priority Failed], [LGWR], [Check traces and OS configuration], [Check Oracle document and MOS notes], []
Incident details in: /oracle/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_147055/orcl_lgwr_61456_i147055.trc

Starting background process DBW0
Errors in file /oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_dbw0_61444.trc  (incident=147039):
ORA-00800: soft external error, arguments: [Set Priority Failed], [DBW0], [Check traces and OS configuration], [Check Oracle document and MOS notes], []
Incident details in: /oracle/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_147039/orcl_dbw0_61444_i147039.trc

Просмотрев трейсы, находим много общего, а именно:

Error Info: Category(-2), Opname(skgdism_send), Loc(sp.c:setpr:0), ErrMsg(Operation not permitted) Dism(128)

Если пойти на MOS то можно найти ноту ORA-00800: soft external error, arguments: [Set Priority Failed], [VKTM] (Doc ID 2931494.1), которая, как по мне, ведёт в тупик(если конечно у вас на $ORACLE_HOME/bin/oradism установлены верные разрешения root:oinstall 4750), особенно если у вас 19.22.

Я же просто установил cgroup_disable=cpu в grub.

vi /etc/default/grub. Добавляем cgroup_disable=cpu в секцию  GRUB_CMDLINE_LINUX.

Далее выполнить:

Для легаси BIOS: grub2-mkconfig —output=/boot/grub2/grub.cfg

Для  UEFI: grub2-mkconfig —output=/boot/efi/EFI/redhat/grub.cfg.

[root@perfdbhost ~]# grub2-mkconfig --output=/boot/grub2/grub.cfg
Generating grub configuration file ...
device-mapper: reload ioctl on osprober-linux-nvme0n4p1 (252:2) failed: Device or resource busy
Command failed.
device-mapper: reload ioctl on osprober-linux-nvme0n5p1 (252:2) failed: Device or resource busy
Command failed.
Done

Перезагружаем хост.

P.S. В дальнейшем можно убрать cgroup_disable=cpu, процессы не получают(??) ошибок Set Priority Failed.