Resolving High CPU Usage on Oracle Servers(读书笔记)

本文分析了一篇关于在安装应用安全补丁后出现性能问题的Oracle邮件应用案例,通过top-down方法,从收集服务器CPU使用率、top和vmstat数据开始,进一步收集SQL跟踪数据和构建问题查询的测试脚本。通过分析问题SQL执行计划,定位到性能瓶颈,并最终通过优化查询和重建索引来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天读了oracle的Case Study中的一篇文章:Resolving High CPU Usage on Oracle Servers.

    案例讲述了一个email application中在安装了一些application secucurity patches之后出现的性能问题。服务器是一个2-cpu的Linux Server。
对案例的分析主要采用top-down的方法,大体流程是这样的:
 
出问题时的top数据如下:
# of processes in the run queue             CPU User mode 
           CPU Sys mode 
            CPU idle 
 
zzz ***Thu Mar 9 18:30:00 PST 2006 
          cpu  procs                      memory    swap          io     system    
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy  id 
 3  0  0    920   8596 342908 4088164   0   0    10   514  501  1790  43   7  50 
 5  0  0    920   8844 343024 4089564   0   0     8    79  319  1751  29   4  67 
21  0  1    920   5332 343160 4093964   0   0    18   320  390  1690  97   3   0 
22  0  0    920  22864 343304 4057500   0   0    11   149  370  2563  97   3   0 
25  0  3    920   9728 343404 4059732   0   0    77   412  400  2412  95   5   0 
23  0  0    920   8416 343688 4044128   0   0     2     2  254  1308  97   3   0 
21  0  1    920   6760 343520 4045256   0   0    56  2428  704  2382  89  10   1 
24  0  0    920  14856 343812 4045968   0   0    54    66  278  2785  95   5   0 
21  0  2    920  17600 343956 4048296   0   0    17    70  249  1677  96   4   0 
20  0  0    920   6028 344080 4050368   0   0     8    52  265  1461  94   6   0 
22  0  1    920  27172 344184 4053608   0   0    25    49  263  2513  96   4   0 
14  0  2    920  58264 344364 4057036   0   0    73   125  614  3821  79  20   1 
 1  1  0    920  65756 344476 4070080   0   0   358  1964  410  2118  12   4  84 
 0  0  0    920  48628 344580 4080864   0   0    17   106  229  1190   9   2  88 


对案例的分析主要采用top-down的方法,大体流程是这样的:

1. Verify CPU consumption on the server,collect top and vmstat data for a period of time.
2. collect extended sql trace data(event 10046)
   gather sid,serial#,and other information from v$session about these sessions;
   trace the sessions using an extendes sql trace via event 10046,level 12;
   produce a TKPROF report and look for the queries having the longest elasped time
3. build a best case script for the problem query(使用绑定变量值)
4. obtain statspack snapshots,collect statspack snapshots during the same time period as the OS were collected and look for correlations
   with the session-level data collected in step 2.
5. tune the query


设置10046事件
SQL> SELECT p.spid, s.sid, s.serial#  
FROM v$session s, v$process p 
WHERE s.paddr = p.addr AND p.spid = 24078 
 
 
SPID                SID    SERIAL# 
------------ ---------- ---------- 
24078                18          5 
 
SQL> begin dbms_system.set_ev(18,5, 10046,12,''); end; -- trace on 
 
-- collect trace information for approximately 15 minutes during the problem 
 
SQL> begin dbms_system.set_ev(18, 5, 10046,0,''); end; -- trace off

问题SQL的执行计划
Rows     Row Source Operation 
-------  --------------------------------------------------- 
     19  TABLE ACCESS BY INDEX ROWID DS_ATTRSTORE  
     26   NESTED LOOPS  
      1    NESTED LOOPS  
      1     VIEW VW_NSO_1  
      1      SORT UNIQUE  
      1       UNION-ALL  
      0        TABLE ACCESS BY INDEX ROWID CT_OBJECTCLASS  
      0         INDEX RANGE SCAN (object id 55349) 
      1        TABLE ACCESS BY INDEX ROWID CT_OBJECTCLASS  
  64439         NESTED LOOPS  
      2          TABLE ACCESS BY INDEX ROWID CT_MAIL  
      2           INDEX RANGE SCAN (object id 55355) 
  64436          INDEX RANGE SCAN (object id 55349) 
CBO used VA_OBJECTCLASS 
index due to INDEX hint 
      0        TABLE ACCESS BY INDEX ROWID CT_OBJECTCLASS  
     27         NESTED LOOPS  
      2          TABLE ACCESS BY INDEX ROWID CT_MAIL  
      2           INDEX RANGE SCAN (object id 55355) 
     24          INDEX RANGE SCAN (object id 55349) 
      1     TABLE ACCESS BY INDEX ROWID CT_DN  
      1      INDEX RANGE SCAN (object id 55345) 
     24    INDEX RANGE SCAN (object id 55340) 
 
定位问题的原因后,重新创建索引后,执行计划
call     count       cpu    elapsed       disk      query    current        rows 
------- ------  -------- ---------- ---------- ---------- ----------  ---------- 
Parse        1      0.02       0.01          0          0          0           0 
Execute      1      0.00       0.00          0          0          0           0 
Fetch        4      0.00       0.00          0         63          0          43 
------- ------  -------- ---------- ---------- ---------- ----------  ---------- 
total        6      0.02       0.01          0         63          0          43 
 
Misses in library cache during parse: 1 
Optimizer goal: CHOOSE 
Parsing user id: 141   
 
Rows     Row Source Operation 
-------  --------------------------------------------------- 
     43  TABLE ACCESS BY INDEX ROWID DS_ATTRSTORE  
     45   NESTED LOOPS  
      1    NESTED LOOPS  
      1     VIEW VW_NSO_1  
      1      SORT UNIQUE  
      1       UNION-ALL  
CBO chose a different index 
(ST_OBJECTCLASS) 
      0        TABLE ACCESS BY INDEX ROWID CT_OBJECTCLASS  
      0         INDEX RANGE SCAN (object id 55349) 
      1        NESTED LOOPS  
      2         TABLE ACCESS BY INDEX ROWID CT_MAIL  
      2          INDEX RANGE SCAN (object id 55355) 
      1         INDEX RANGE SCAN (object id 55348) 
      0        NESTED LOOPS  
      2         TABLE ACCESS BY INDEX ROWID CT_MAIL  
      2          INDEX RANGE SCAN (object id 55355) 
      0         INDEX RANGE SCAN (object id 55348) 
      1     TABLE ACCESS BY INDEX ROWID CT_DN  
      1      INDEX RANGE SCAN (object id 55345) 
     43    INDEX RANGE SCAN (object id 55340) 
 
Elapsed times include waiting on following events: 
  Event waited on                             Times   Max. Wait  Total Waited 
  ----------------------------------------   Waited  ----------  ------------ 
  SQL*Net message to client                       4        0.00          0.00 
  SQL*Net message from client                     4        1.25          1.29

问题得到解决。

文章名字为CS_HighCPU.pdf


<think>我们正在解决Maven依赖问题。用户询问如何解决Maven依赖问题。根据提供的引用,我们可以总结以下几点: 1. 依赖排除(Dependency Exclusions):当传递性依赖引入不需要的依赖时,可以在POM中声明排除特定的groupId和artifactId(引用[1])。 2. 依赖来源跟踪:Maven使用Aether作为仓库访问层,会跟踪依赖的来源(引用[2])。 3. Java 11及以上版本需要手动添加Java EE API依赖,因为Java EE已经从JDK中移除(引用[3])。 4. 仓库配置:可以添加额外的仓库地址,例如解决某些依赖在中央仓库中找不到的问题(引用[4])。 常见的Maven依赖问题包括: - 依赖冲突(多个版本) - 依赖缺失(仓库中不存在) - 依赖版本不兼容 - 传递性依赖引入问题 解决步骤: 1. **分析依赖树**:使用`mvn dependency:tree`命令查看依赖树,找出冲突或不需要的依赖。 2. **排除依赖**:在POM文件中使用`<exclusions>`标签排除特定依赖。 3. **添加缺失依赖**:如果依赖缺失,检查仓库配置,可能需要添加仓库(如引用[4]所示)或手动添加依赖。 4. **解决版本冲突**:可以通过`<dependencyManagement>`统一管理版本,或直接指定版本。 5. **更新依赖**:使用`mvn versions:display-dependency-updates`检查依赖更新。 针对Java 11及以上版本,如果遇到Java EE相关依赖问题,需要显式添加依赖(如引用[3]所示)。 示例:排除依赖 ```xml <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>unwanted.group</groupId> <artifactId>unwanted-artifact</artifactId> </exclusion> </exclusions> </dependency> ``` 示例:添加Java EE依赖(如JAXB) ```xml <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> ``` 如果依赖在中央仓库找不到,添加仓库: ```groovy // 在Gradle中(引用[4]是Gradle配置,但Maven类似) // Maven配置在pom.xml的<repositories>中 <repositories> <repository> <id>restlet</id> <url>http://maven.restlet.org</url> </repository> </repositories> ``` 注意:Maven默认使用中央仓库,如果添加其他仓库,请确保其可靠性。 其他工具: - 使用IDE的依赖分析工具(如IntelliJ IDEA的Maven工具窗口) - 使用`mvn dependency:analyze`分析依赖 如果问题仍然存在,请提供具体的错误信息或描述,以便进一步分析。</think>### 如何解决 Maven 依赖问题 Maven 依赖问题通常由依赖冲突、版本不兼容或仓库配置错误引起。以下是系统化的解决方案: #### 1. **依赖冲突分析** 使用命令分析依赖树: ```bash mvn dependency:tree ``` - 查看是否存在多个版本的相同依赖 - 识别冲突的传递性依赖(如引用[1]所述) - 示例输出片段: ``` [INFO] com.example:project:jar:1.0 [INFO] +- org.lib:A:jar:2.0:compile [INFO] | \- org.conflict:X:jar:1.0:compile <!-- 冲突点 --> ``` #### 2. **依赖排除(关键步骤)** 在 POM 中排除冲突依赖(引用[1]示例): ```xml <dependency> <groupId>org.main</groupId> <artifactId>core-lib</artifactId> <version>3.2</version> <exclusions> <exclusion> <!-- 排除传递性依赖 --> <groupId>org.conflict</groupId> <artifactId>X</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3. **处理 Java 版本兼容性** Java 9+ 模块化后需显式添加 EE 依赖(引用[3]方案): ```xml <!-- 添加缺失的 Java EE API --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> ``` #### 4. **仓库配置优化** - **添加自定义仓库**(引用[4]示例): ```xml <repositories> <repository> <id>restlet-repo</id> <url>http://maven.restlet.org</url> </repository> </repositories> ``` - **优先使用本地仓库**: ```xml <repository> <id>local-maven</id> <url>file://${user.home}/.m2/repository</url> </repository> ``` #### 5. **版本锁定策略** 使用 `<dependencyManagement>` 统一版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> <!-- 强制指定版本 --> </dependency> </dependencies> </dependencyManagement> ``` #### 6. **诊断工具** - **依赖分析**: ```bash mvn dependency:analyze ``` - **检查更新**: ```bash mvn versions:display-dependency-updates ``` #### 7. **常见错误解决** | 错误类型 | 解决方案 | |--------------------------|--------------------------------------------------------------------------| | `ClassNotFoundException` | 检查依赖范围(`<scope>`),确保 runtime 依赖存在 | | `NoSuchMethodError` | 使用 `mvn dependency:tree` 确认是否存在多个版本冲突 | | 认证失败 | 在 `settings.xml` 中配置仓库凭证 | | 快照版本不稳定 | 使用 `-U` 参数强制更新:`mvn clean install -U` | > **注意**:Maven 3.x 后使用 Aether 跟踪依赖来源(引用[2]),可通过 `mvn -X` 启用调试模式查看详细依赖解析路径。 ### 相关问题 1. Maven 依赖范围(compile/runtime/test)有哪些实际区别? 2. 如何配置 Maven 私有仓库(如 Nexus)解决企业级依赖问题? 3. 在多模块项目中如何高效管理依赖版本? 4. Maven 的 BOM(Bill of Materials)依赖管理机制如何工作? [^1]: MAVEN POM dependencies and Dependency Exclusions [^2]: Aether repository access layer [^3]: Java EE APIs in Java 11+ [^4]: Repository configuration example
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值