WSO2 DAS - 使用 oracleDB 11g 时具有较高的 CPU 使用率



我正在使用Oracle数据库11g(关系数据库)配置DAS 3.1.0 + APIM 2.0.0。

当我启用 DAS 分析统计信息以与 API 管理器集成时,除了 DAS 显著提高具有数据库的计算机的 CPU 消耗水平的部分之外,几乎所有内容都运行良好。

我注意到他总是运行这个查询:

MERGE INTO API_REQ_USER_BROW_SUMMARY dest USING( SELECT :1 api, :2
version, :3 apiPublisher, :4 tenantDomain, :5 total_request_count, :6 
year, :7 month, :8 day, :9 requestTime, :10 os, :11 browser FROM dual) 
src ON(dest.api=src.api AND dest.version=src.version AND 
dest.apiPublisher=src.apiPublisher AND dest.year=src.year AND 
dest.month=src.month AND dest.day=src.day AND dest.os=src.os AND 
dest.browser=src.browser AND dest.tenantDomain=src.tenantDomain)WHEN NOT 
MATCHED THEN INSERT(api, version, apiPublisher, tenantDomain, 
total_request_count, year, month, day, requestTime, os, browser) 
VALUES(src.api, src.version, src.apiPublisher, src.tenantDomain, 
src.total_request_count, src.year, src.month, src.day, src.requestTime, 
src.os, src.browser) WHEN MATCHED THEN UPDATE SET 
dest.total_request_count=src.total_request_count, 
dest.requestTime=src.requestTime

我想知道是否有办法进行优化,以便数据分散的机器的 CPU 不会受到太大打击,从而导致性能下降。

拜托,有没有人遇到过这个困难,你能帮我吗?

在上面的查询中发生的情况是,如果数据库中没有具有相同主键值的记录,或者如果有一些记录具有相同的主键,则记录入到数据库中,然后我们更新现有记录。

表"API_REQ_USER_BROW_SUMMARY"有两列"OS"和"浏览器",它们是该表主键的一部分。观察到,当 NULL 值插入到"OS"和"浏览器"中时,分析服务器和数据库将挂起。

您可以做的是,(在执行步骤之前,您可能需要关闭分析服务器并重新启动数据库服务器)

  1. 转到{Analytics_server}/repository/deployment/server/carbonapps,然后以zip文件打开org_wso2_carbon_analytics_apim-1.0.0.car。
  2. 转到文件夹 APIM_USER_AGENT_STATS_1.0.0
  3. 打开APIM_USER_AGENT_STATS.xml
  4. 在脚本的末尾(标记之前),您将看到如下所示的 sparkSql 查询。

INSERT INTO TABLE APIUserBrowserData SELECT api,version,apiPublisher,tenantDomain,total_request_count,year,month,day,requestTime,os,browser FROM API_REQUEST_USER_BROWSER_SUMMARY_FINAL;

  1. 将该行替换为以下内容。

INSERT INTO TABLE APIUserBrowserData SELECT api,version,apiPublisher,tenantDomain,total_request_count,year,month,day,requestTime, if(os is null, "UNKNOWN",os), if(browser is null, "UNKNOWN", browser) FROM API_REQUEST_USER_BROWSER_SUMMARY_FINAL;

这将防止 Spark 将 NULL 值插入到表"API_REQ_USER_BROW_SUMMARY"中的"OS"和"浏览器"列。 执行上述更改后,请检查CPU消耗是否很高。

编辑:@artCampos,我无法发表评论,所以我正在编辑我的原始答案以回复您的评论。不会有任何副作用。但是,请注意,我们将 NULL 值替换为字符串值"UNKOWN"。我认为在这种情况下这不是问题。您无需丢弃任何现有数据。另请注意,无论如何,如果将 NULL 值插入到 数据库主键,它将在大多数RDBMS中失败。

最新更新