Phân tích tỷ lệ sử dụng CPU từ bảng dba_hist_osstat trong Oracle 11g

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_osstatdba_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
Các chỉ số thời gian được tính bằng centi-seconds (1/100 giây), và có mối quan hệ như sau:
Tổng thời gian quan sát = BUSY_TIME + IDLE_TIME  
Tỷ lệ CPU sử dụng (%) = (BUSY_TIME / (BUSY_TIME + IDLE_TIME)) * 100
Cô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.

Thẻ: Oracle Performance tuning AWR dba_hist_osstat SQL monitoring

Đăng vào ngày 1 tháng 8 lúc 14:04