Trong Oracle 11g, hệ thống lưu trữ các chỉ số hiệu suất cấp độ hệ điều hành thông qua các view
dba_hist_osstat và dba_hist_osstat_name. Trong đó, dba_hist_osstat_name cung cấp danh sách các chỉ số khả dụng, còn dba_hist_osstat ghi nhận giá trị tương ứng theo từng mốc thời gian snapshot.
Ví dụ truy vấn liệt kê các chỉ số hệ thống:
SELECT * FROM DBA_HIST_OSSTAT_NAME;Kết quả trả về bao gồm các metric như:
- NUM_CPUS: Tổng số luồng xử lý (ví dụ: 64)
- NUM_CPU_CORES: Số nhân vật lý (ví dụ: 32)
- NUM_CPU_SOCKETS: Số lượng socket CPU (ví dụ: 4)
- IDLE_TIME: Thời gian CPU rảnh
- BUSY_TIME: Thời gian CPU bận
- USER_TIME: Thời gian chạy ở chế độ user
- SYS_TIME: Thời gian chạy ở chế độ kernel
- IOWAIT_TIME: Thời gian chờ I/O
- LOAD: Giá trị tải hệ thống tại thời điểm bắt đầu snapshot
Tổng thời gian quan sát = BUSY_TIME + IDLE_TIME Tỷ lệ CPU sử dụng (%) = (BUSY_TIME / (BUSY_TIME + IDLE_TIME)) * 100Công thức này cho phép tính toán mức độ sử dụng CPU trung bình giữa hai snapshot liên tiếp. Ngoài ra, chỉ số LOAD phản ánh mức độ bão hòa hệ thống tại thời điểm snapshot, tương ứng với "Load Average" trong báo cáo AWR. Dưới đây là câu lệnh SQL tổng hợp để phân tích hiệu suất hệ thống theo từng khoảng snapshot, bao gồm cả hoạt động I/O vật lý, thời gian xử lý của cơ sở dữ liệu và tỷ lệ sử dụng CPU:
SELECT
s.instance_number AS inst_id,
s.snap_id,
TO_CHAR(s.end_interval_time, 'YYYY-MM-DD HH24:MI') AS time_point,
pr_new.value - pr_old.value AS phys_reads,
pw_new.value - pw_old.value AS phys_writes,
ROUND((dt_new.value - dt_old.value) / 1e6 / 60, 2) AS db_time_min,
ROUND(
(busy_new.value - busy_old.value) * 100.0 /
GREATEST(
(busy_new.value - busy_old.value) +
(idle_new.value - idle_old.value),
1
),
2
) AS cpu_util_pct
FROM
dba_hist_snapshot s
JOIN dba_hist_sysstat pr_old ON pr_old.dbid = s.dbid
AND pr_old.instance_number = s.instance_number
AND pr_old.snap_id = s.snap_id - 1
AND pr_old.stat_name = 'physical reads'
JOIN dba_hist_sysstat pr_new ON pr_new.dbid = s.dbid
AND pr_new.instance_number = s.instance_number
AND pr_new.snap_id = s.snap_id
AND pr_new.stat_name = 'physical reads'
JOIN dba_hist_sysstat pw_old ON pw_old.dbid = s.dbid
AND pw_old.instance_number = s.instance_number
AND pw_old.snap_id = s.snap_id - 1
AND pw_old.stat_name = 'physical writes'
JOIN dba_hist_sysstat pw_new ON pw_new.dbid = s.dbid
AND pw_new.instance_number = s.instance_number
AND pw_new.snap_id = s.snap_id
AND pw_new.stat_name = 'physical writes'
JOIN dba_hist_sys_time_model dt_old ON dt_old.dbid = s.dbid
AND dt_old.instance_number = s.instance_number
AND dt_old.snap_id = s.snap_id - 1
AND dt_old.stat_name = 'DB time'
JOIN dba_hist_sys_time_model dt_new ON dt_new.dbid = s.dbid
AND dt_new.instance_number = s.instance_number
AND dt_new.snap_id = s.snap_id
AND dt_new.stat_name = 'DB time'
JOIN dba_hist_osstat idle_old ON idle_old.dbid = s.dbid
AND idle_old.instance_number = s.instance_number
AND idle_old.snap_id = s.snap_id - 1
AND idle_old.stat_name = 'IDLE_TIME'
JOIN dba_hist_osstat idle_new ON idle_new.dbid = s.dbid
AND idle_new.instance_number = s.instance_number
AND idle_new.snap_id = s.snap_id
AND idle_new.stat_name = 'IDLE_TIME'
JOIN dba_hist_osstat busy_old ON busy_old.dbid = s.dbid
AND busy_old.instance_number = s.instance_number
AND busy_old.snap_id = s.snap_id - 1
AND busy_old.stat_name = 'BUSY_TIME'
JOIN dba_hist_osstat busy_new ON busy_new.dbid = s.dbid
AND busy_new.instance_number = s.instance_number
AND busy_new.snap_id = s.snap_id
AND busy_new.stat_name = 'BUSY_TIME'
ORDER BY s.instance_number, s.snap_id;
Kết quả truy vấn cung cấp cái nhìn toàn diện về hiệu năng hệ thống theo thời gian, giúp phát hiện các giai đoạn cao điểm về I/O, thời gian xử lý hoặc áp lực lên CPU.