问题概述
在OLE7使用uek内核的环境中,将Oracle数据库从19.5升级至19.17后,在启动数据库的过程中出现了ORA-00800的报错。
2024-11-23T20:49:43.387456+08:00 Errors in file /u01/app/oracle/diag/rdbms/racdb/racdb1/trace/racdb1_vktm_15343.trc (incident=665664) (PDBNAME=CDB$ROOT): ORA-00800: soft external error, arguments: [Set Priority Failed], [VKTM], [Check traces and OS configuration], [Check Oracle document and MOS notes], [] Incident details in: /u01/app/oracle/diag/rdbms/racdb/racdb1/incident/incdir_665664/racdb1_vktm_15343_i665664.trc 2024-11-23T20:49:43.389878+08:00 Error attempting to elevate VKTM's priority: no further priority changes will be ........ Starting background process LMHB 2024-11-23T20:49:43.732171+08:00 Errors in file /u01/app/oracle/diag/rdbms/racdb/racdb1/trace/racdb1_lms1_15395_15399.trc (incident=691217): ORA-00800: soft external error, arguments: [Set Priority Failed], [LMS1], [Check traces and OS configuration], [Check Oracle document and MOS notes], [] Incident details in: /u01/app/oracle/diag/rdbms/racdb/racdb1/incident/incdir_691217/racdb1_lms1_15395_15399_i691217.trc 2024-11-23T20:49:43.735534+08:00 Error attempting to elevate LMS1's priority: no further priority changes will be attempted for this process 2024-11-23T20:49:43.746431+08:00 ....... 2024-11-23T20:49:43.791114+08:00 Errors in file /u01/app/oracle/diag/rdbms/racdb/racdb1/trace/racdb1_lms0_15393_15398.trc (incident=691218): ORA-00800: soft external error, arguments: [Set Priority Failed], [LMS0], [Check traces and OS configuration], [Check Oracle document and MOS notes], [] Incident details in: /u01/app/oracle/diag/rdbms/racdb/racdb1/incident/incdir_691218/racdb1_lms0_15393_15398_i691218.trc 2024-11-23T20:49:43.792635+08:00 Error attempting to elevate LMS0's priority: no further priority changes will be attempted for this process
alter 中提示 VKTM,LMS等进程在提升优先级的过程失败。
问题原因
在OLE 7或者UEK 4 的环境中,在启动DB的时候要求为cgroup设置rt_period和rt_runtime
一般情况下使用root的默认设置,除非用户设置了自己的cgroup或者使用 system user slices
它需要合适的值,比如95%
解决方案
1、设置优先级失败可以能是因为oradism 权限问题或者是操作系统配置问题
[oracle@node1 ~]$ ll /u01/app/oracle/product/19.0.0.0/dbhome_1/bin/oradism -rwsr-x---. 1 root oinstall 147848 Apr 17 2019 /u01/app/oracle/product/19.0.0.0/dbhome_1/bin/oradism
权限正确。
2、检查_high_priority_processes 参数是否设置了进程的优先级
SQL> select a.ksppinm "Parameter",
2 b.ksppstvl "Session Value",
3 c.ksppstvl "Instance Value",
4 a.KSPPDESC "Describtion"
5 from x$ksppi a, x$ksppcv b, x$ksppsv c
where a.indx = b.indx and a.indx = c.indx
6 7 and a.ksppinm like '_%' and a.ksppinm like
'_highest_priority_process%'; 8
Parameter
--------------------------------------------------------------------------------
Session Value
--------------------------------------------------------------------------------
Instance Value
--------------------------------------------------------------------------------
Describtion
--------------------------------------------------------------------------------
_highest_priority_processes
VKTM
VKTM
Highest Priority Process Name Mask
从参数设置中可以发现,VKTM进程已经设置了最高优先级。但是在告警日志中还是出现该进程的优先级不符合要求,所以可以判断当前报错不是由于该参数设置不合理导致。
既然上面的设置都是正常的,那么就有可能是cgroup导致的,下面检查一下进程的cgroup
[oracle@node1 ~]$ ps -ef | grep pmon grid 5228 1 0 20:46 ? 00:00:00 asm_pmon_+ASM1 oracle 22184 1 0 21:31 ? 00:00:00 ora_pmon_racdb1 oracle 23828 21301 0 21:38 pts/0 00:00:00 grep --color=auto pmon [oracle@node1 ~]$ cat /proc/22184/cgroup | grep cpu 9:cpuset:/ 8:cpu,cpuacct:/user.slice [oracle@node1 ~]$
可以看出当面数据库的进程使用了 user.slice,且user.slice 中rt_period和rt_runtime的设置为
[root@node1 ~]# cat /sys/fs/cgroup/cpu,cpuacct/user.slice/cpu.rt_period_us 1000000 [root@node1 ~]# cat /sys/fs/cgroup/cpu,cpuacct/user.slice/cpu.rt_runtime_us 0 [root@node1 ~]#
很显然cpu.rt_runtime_us设置是不符合要求的,应当设置为950000
使用下面命令进行修改cpu.rt_runtime_us,再重启数据库。
[root@node1 ~]# echo 950000 > /sys/fs/cgroup/cpu,cpuacct/user.slice/cpu.rt_runtime_us
此时将不会再出现ORA-00800的报错,但重启后该参数将会复原。
如果想要永久保持,可使用cgconfig 将cgroup的参数持久化
[root@node1 yum.repos.d]# yum install libcgroup-tools [root@node1 ~]# vi /etc/cgconfig.conf group user.slice { cpu { cpu.rt_period_us = 1000000; cpu.rt_runtime_us = 950000; } } [root@node1 ~]# systemctl start cgconfig [root@node1 ~]# systemctl enable cgconfig
在测试过程中发现,使用SQL plus 启动数据库时会调用user.slice,但使用srvctl 启动数据库时将不会调用user.slice。
使用sqlplus 启动数据库
[oracle@node1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 23 22:25:35 2024
Version 19.17.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 3724538680 bytes
Fixed Size 9147192 bytes
Variable Size 1409286144 bytes
Database Buffers 2298478592 bytes
Redo Buffers 7626752 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
[oracle@node1 ~]$ ps -ef | grep pmon
grid 4328 1 0 22:11 ? 00:00:00 asm_pmon_+ASM1
oracle 6112 1 0 22:25 ? 00:00:00 ora_pmon_racdb1
oracle 7030 6033 0 22:26 pts/0 00:00:00 grep --color=auto pmon
[oracle@node1 ~]$ cat /proc/6112/cgroup | grep cpu
7:cpuset:/
6:cpu,cpuacct:/user.slice
[oracle@node1 ~]$
使用srvctl 启动数据库
[oracle@node1 ~]$ srvctl start instance -db racdb -n node1 [oracle@node1 ~]$ ps -ef | grep pmon grid 4328 1 0 22:11 ? 00:00:00 asm_pmon_+ASM1 oracle 7675 1 0 22:28 ? 00:00:00 ora_pmon_racdb1 oracle 8613 6033 0 22:29 pts/0 00:00:00 grep --color=auto pmon [oracle@node1 ~]$ cat /proc/7675/cgroup | grep cpu 7:cpuset:/ 6:cpu,cpuacct:/ [oracle@node1 ~]$
简单使用strace 观察一下 使用sqlplus 和srvctl 启动数据库是否有区别
[oracle@node1 ~]$ strace -o start.trc srvctl start instance -db racdb -n node1 [oracle@node1 ~]$ [oracle@node1 ~]$ cat start.trc | grep cgroup [oracle@node1 ~]$ [root@node1 ~]# ps -ef |grep sqlplus oracle 9092 6033 0 22:31 pts/0 00:00:00 sqlplus as sysdba root 9133 9102 0 22:31 pts/1 00:00:00 grep --color=auto sqlplus [root@node1 ~]# ps -ef | grep 9092 oracle 9092 6033 0 22:31 pts/0 00:00:00 sqlplus as sysdba oracle 9093 9092 0 22:31 ? 00:00:00 oracleracdb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) root 9143 9102 0 22:31 pts/1 00:00:00 grep --color=auto 9092 [root@node1 ~]# strace -p 9093 -o starup.trc strace: Process 9093 attached [root@node1 ~]# [root@node1 ~]# cat starup.trc | grep cgroup open("/proc/self/cgroup", O_RDONLY) = 11 open("/proc/self/cgroup", O_RDONLY) = 11 open("/proc/self/cgroup", O_RDONLY) = 16 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 10 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 15 open("/proc/self/cgroup", O_RDONLY) = 29 open("/proc/self/cgroup", O_RDONLY) = 29 open("/proc/self/cgroup", O_RDONLY) = 28 open("/proc/self/cgroup", O_RDONLY) = 28
参考文档
ORA-00800: soft external error, arguments: [Set Priority Failed], [VKTM] (文档 ID 2718971.1)
Oracle Linux: How to Set Value on cgroup Parameter Persistently? (文档 ID 2913447.1)
公众号:ZXM的学习笔记
墨天伦:https://www.modb.pro/u/15528




