今天出现严重的等待事件PX Deq Credit: send blkd,与实施组沟通,系统并没有慢的情况。
Snap Id | Snap Time | Sessions | Cursors/Session | |
---|---|---|---|---|
Begin Snap: | 21524 | 13-3月 -13 14:00:24 | 365 | 19.5 |
End Snap: | 21528 | 13-3月 -13 18:00:15 | 357 | 20.6 |
Elapsed: | 239.84 (mins) | |||
DB Time: | 1,465.76 (mins) |
Event | Waits | Time(s) | Avg Wait(ms) | % Total Call Time | Wait Class |
---|---|---|---|---|---|
PX Deq Credit: send blkd | 26,261 | 50,747 | 1,932 | 57.7 | Other |
CPU time | 32,444 | 36.9 | |||
SQL*Net more data to client | 357,623,209 | 7,296 | 0 | 8.3 | Network |
db file sequential read | 362,866 | 1,119 | 3 | 1.3 | User I/O |
log file sync | 56,153 | 705 | 13 | .8 | Commit |
Event | Waits | %Time -outs | Total Wait Time (s) | Avg wait (ms) | Waits /txn |
---|---|---|---|---|---|
PX Deq Credit: send blkd | 8,648 | 89 | 15,556 | 1799 | 0.15 |
Elapsed Time (s) | CPU Time (s) | Executions | Elap per Exec (s) | % Total DB Time | SQL Id | SQL Module | SQL Text |
---|---|---|---|---|---|---|---|
50,759 | 2 | 0 | 57.72 | 4hj78qkyk67p0 | ORACLE.EXE | SELECT "ARCHIVES_ID", "CONTENT... |
通过数据字典查到此表是有并行操作的。
SQL>select table_name,degree from user_tables where table_name='ARCHIVES_CONTENT';
TABLE_NAME DEGREE
------------------------------ --------------------
ARCHIVES_CONTENT 4
一般来说空闲等待可以忽略它,但是实际上空闲等待也是需要关注的,因为一个空闲的等待,它反映的是另外的资源已经超负荷运行了。基于这个原因,在Oracle 10g里已经把PX Deq Credit: send blkd等待时间不在视为空闲等待,而是列入了Others 等待事件范围。
PX Deq Credit: send blkd 等待事件的意思是:当并行服务进程向并行协调进程QC(也可能是上一层的并行服务进程)发送消息时,同一时间只有一个并行服务进程可以向上层进程发送消息,这时候如果有其他的并行服务进程也要发送消息,就只能等待了。 知道获得一个发送消息的信用信息(Credit),这时候会触发这个等待事件,这个等待事件的超时时间为2秒钟。
如果我们启动了太多的并行进程,实际上系统资源(CPU)或者QC 无法即时处理并行服务发送的数据,那么等待将不可避免。 对于这种情况,我们就需要降低并行处理的并行度。
当出现PX Deq Credit:send blkd等待的时间很长时,我们可以通过平均等待时间来判断等待事件是不是下层的并行服务进程空闲造成的。该等待事件的超时时间是2秒,如果平均等待时间也差不多是2秒,就说明是下层的并行进程“无事所做”,处于空闲状态。 如果和2秒的差距很大,就说明不是下层并行服务超时导致的空闲等待,而是并行服务之间的竞争导致的,因为这个平均等待事件非常短,说明并行服务进程在很短时间的等待之后就可以获取资源来处理数据。
所以对于非下层的并行进程造成的等待,解决的方法就是降低每个并行执行的并行度,比如对象(表,索引)上预设的并行度或者查询Hint 指定的并行度。