1.服务器资源检查
不良的SQL语句最明显的问题,就会造成服务器资源使用率的飙升,影响其他正常的业务无法获取资源造成等待,通过对操作系统cpu及内存的查看,来识别系统资源的瓶颈。
内存使用情况(示例):
Procs:
R:等待执行的任务数,展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈
B:等待IO的进程数量,这列的值如果长时间大于1,则需要进行关注了
Memory:
Swpd:正在使用虚拟的内存大小,单位k
Free:空闲内存大小
Buff:已用的buff大小,对块设备的读写进行缓冲,即将写入磁盘的缓冲大小
Cache:已用的cache大小,文件系统的cache,从磁盘中读取的缓存大小
Swap:
Si:每秒从交换区写入内存的大小(单位:kb/s)由内存进入交换区的数量
So:每秒从内存写到交换区的大小,由交换区进入内存的数量
Io:
Bi:每秒读取的块数(读磁盘)从块设备读取数据的量(读磁盘)
Bo:每秒写入的块数(写磁盘)从块设备写入数据的量(写磁盘)
System:
In:每秒中断数,包括时钟中断,表示在某一时间间隔中观测到的每秒设备中断数
Cs:每秒上下文切换数,表示每秒产生的上下文切换次数
Cpu:
Us:用户进程执行消耗cpu时间(user time),us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了
Sy:系统进程消耗cpu时间,sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。
Id:空闲时间(包括IO等待时间)
Wa:等待IO时间,Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。
St:从虚拟机窃取的时间,一般都为0,不用关注
cpu使用情况(示例):
通过对内存和cpu的查看,可以定位出目前服务运行的资源瓶颈在哪,是内存跑慢了,还是CPU跑慢了。针对具体的情况可以在进行下步的分析。
2.查询占用cpu最多的线程
查询cpu占用最高的线程(示例):
ps -eLo pcpu,pmem,pid,tid,psr,wchan:14,comm|grep dmserver的线程号 |sort
通过以上查询可以看到占用CPU较高的都是dm_sql_thd线程,dm_sql_thd 是用户线程。一般通过客户端连接的线程都是属于这个类别。
既然属于用户连接的信息,那么通过数据库的v$sessions视图就可以查询出,这个线程正在执行的动作。
线程介绍:
线程名 功能
dm_quit_thd 用于执行正常关闭数据库的线程
dm_io_thd IO线程,由IO_THR_GROUPS参数控制,默认为2个线程
dm_rsyswrk_thd 异步归档线程,属于归档线程,主要负责将任务队列中的任务,按照归档类型进行相应的归档处理,一般有日志flushh线程触发
dm_chkpnt_thd 检查点线程,主要负责CKPT_LSN的管理
dm_redolog_thd 日志flush线程,负责日志刷盘,当事物提交或者发生检查点是触发
dm_hio_thd IO线程,主要处理HFS相关的IO读取操作,比如HUGE表的IO读取就有该线程负责完成
dm_sqllog_thd sql执行日志记录线程
dm_purge_thd purge线程。主要负责回滚段清理
dm_tskwrk_thd 任务线程,由参数TASK_THREADS控制,取值范围为1-1000,默认为16,主要负责完成服务端SQL的解析运行等任务
dm_trctsk_thd 日志信息记录线程,主要负责数据库告警跟踪信息写入告警日志文件中
dm_wrkgrp_thd 工作线程,由参数WORKER_THREADS控制,取值范围为1-64,默认值为16,主要负责所有实际的数据相关操作
dm_audit_thd 审计线程,主要负责审计日志记录与更新
dm_sched_thd 调度线程,每秒钟轮询一次,主要负责接管数据库内部所有需要定时调度的任务,调度线程具备唤醒工作线程、向任务队列中添加任务队列、动态缓冲区检查、SQL缓存清理等权限
dm_lsnr_thd 监听线程。主要负责数据库服务器端口监听,处理客户端请求,并将连接请求加入到工作线程的任务队列,由工作线程完成任务处理。监听线程在数据库服务启动完成之后才启动,关闭数据库时首先被关闭
dm_sql_thd 用户线程。一般通过客户端连接的线程都是属于这个类别
DM 提供了很多动态性能视图,通过它们用户可以直观地了解当前系统中有哪些线程在工作,以及线程的相关信息。
相关动态视图:
名称 说明
V$LATCHES 记录当前正在等待的线程信息
V$THREADS 记录当前系统中活动线程的信息
V$PROCESS 记录服务器进程信息
3.查询线程对应的SQL语句
查询线程执行的内容(示例):
4.数据库内存使用情况分析
DM的内存池包括共享内存池和一些运行时内存池,共享内存池是 DM Server 在启动时从操作系统申请一大片内存供系统运行时使用,避免运行期间频繁的进行系统调用降低系统运行效率,提供参数MEMORY_POOL设置大小和MEMORY_TARGET参数设置上限;运行时内存池为DM 的一些功能模块在运行时使用的自己运行时内存池,这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
查询占用内存高的SQL(示例):
select a.creator,b.sql_text,
trunc(sum(a.total_size/1024/1024)) "分配大小(M)",
trunc(sum(a.data_size/1024/1024))"占用大小(M)"
from v$MEM_POOL a,v$SESSIONS b
where a.creator=b.thrd_id
group by a.creator,b.sql_text
order by 3 desc;
5.数据库的内存参数优化
合理的配置内存参数也是优化的关键步骤,让数据库可以充分的使用系统资源可以有效改善数据库运行效率
在优化内存之间需要首先了解数据库的内存结构。数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是 DBMS 系统所必须的。DM 数据库管理系统的内存结构主要包括内存池、 缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
内存池 v$mem_pool
在 DM Server 的运行期间, 经常会申请与释放小片内存,而直接向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换, 降低系统运行效率。 于是 DM 采用采用共享内存池的方式: 一次向操作系统申请一片较大内存, 作为共享内存池。 当系统在运行过程中需要申请小片内存时, 可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
关于内存池的参数主要有三个:
参数名 含义 建议值
MEMORY_POOL 共享池大小的参数为 ,缺省大小为 500M 2000
MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小 一般默认即可
MEMORY_TARGET 指定了共享内存池扩展到超过该值后,空闲时会收缩到的大小 内存大小的10%
缓冲区 v$bufferpool
缓冲区包括数据缓冲区、日志缓冲区、字典缓冲区、SQL 缓冲区
数据缓冲区是数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方,分为四种类别,分别为:
根据内存的大小合理配置缓存中的参数是主要针对缓存区的优化手段。
文章
阅读量
获赞