0%

连接池

数据源是各种数据库,甚至你可以认为excel都是一个数据源。连接池是为了复用连接数据源的链接的管理池。
连接池的监控可以反应一部分的业务高峰,形成告警。持续的监控指标也能作为应用崩溃的复盘数据。

监控原理

公司平台使用普罗米修斯采集Java暴露的JMX数据,作为产品研发团队,只需要在程序启动后,将每个数据源包装一个Listener,多个数据源打包成map,交给MBeanExporter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MBeanExporter exporter = new MBeanExporter();
// 探测模式 0不自动 1当前IOC容器查找组件 2 根据的策略进行探测
exporter.setAutodetectMode(0);
Map<String, AtomikosDataSourceBean> dataSources = null; // 自行获取
Map<String, Object> map = new HashMap<String, Object>();
for (String key : dataSources.keySet()) {
AtomikosDataSourceBean dataSrouce = dataSources.get(key);
DataSourceListener listener = new DataSourceListener(dataSrouce);
map.put("Catalina:type=DatasourceConnectionPool,name=" + dataSrouce.getUniqueResourceName(), listener);
}

exporter.setBeans(map);
exporter.afterPropertiesSet();
exporter.afterSingletonsInstantiated();

指标设置

样例代码中,指标的计算是这样的:
最大上限: maxSize
当前创建: poolSize(池中总连接)
空闲数: available(池中可用连接)
已使用: poolSize - available
利用率: (poolSize - available) / poolSize

一开始我是觉得不太合理,监控的时候,不太好监控。仔细思考一下,也可以组合一下用当前暴露的指标做监控:

  1. 当前创建>90 (硬指标,不方便)
  2. 利用率在多个采集周期都>90% (持续高涨,当前创建数应该会增加)

其实如果不是非常学院派,常人理解的指标应该是这样计算:
最大上限: maxSize
当前创建: poolSize
空闲数: maxSize - poolSize
已使用: poolSize - available
利用率: poolSize / maxSize

现网有服务量大的服务,一次OOM后只留下了javacore文件,heapdump没有生成,这次去另一台一样职责的机器上检查取一下javacore和heap dump文件。

阅读全文 »

Cookie的domain和path

domain

1
Set-Cookie: login_sip=1D-8B-35; Path=/; Domain=.example.com

SSO单点登录后,返回的头信息中应该包括若干条Set-Cookie,上述的Cookie说明此key-value的Cookie能用于*.example.com所有二级域名,Path=/表示后续所有路径都可以使用。
下面说的所有二级域名当然包括一级域名。

  • Path=/; Domain=.example.com 所有二级域名,所有uri
  • Path=/; Domain=account.example.com 仅account.example.com这个二级域名可用,所有uri
  • Path=/openapi; Domain=.example.com 所有二级域名,仅匹配/openapi的uri

坑重现

JMeter的Server Name or IP中,域名或ip后不应该添加任何东西,perf.example.com192.168.1.1都是对的,以下都是错误的例子。

  • perf.example.com/
  • perf.example.com/zoo
  • 192.168.1.1:8080
    如果填写的是perf.example.com/,就会出现错误信息:Not storing invalid cookie: <aasso_login=””; Path=/; Domain=.example.com> for URL http://perf.example.com//zoo/services/N (Illegal ‘domain’ attribute “example.com”. Domain of origin: “perf.example.com/“)

前端内存泄漏 - 威力加强版

背景

前端应用越来越复杂,反复操作可能导致dom或js对象没有被正确回收,导致内存占用持续高位。

测试原理

  • Selenium 控制浏览器反复操作
  • psutil 获取操作系统层面的内存占用
  • window.performance.memory 获取浏览器V8引擎级别js堆内存使用情况(chrome only)
  • openpyxl 记录到excel
  • robotframework 包装降低学习成本
graph LR
    A[Robot framework/Selenium] --pid--> B[pstutil]
    A --获取pid--> C[chromedriver]
    A --执行js获取内存占用-->C
    B --获取所有子进程chrome的pid--> A
    B --chrome进程的内存占用--> A
graph TD
    A[Selenium: 获取chromedriver进程号] --> B[psutil: 获取多个子进程chrome的进程号]
    B --> C[psutil: 获取子进程的内存占用]
    C --> D[chrome: 执行js获取js使用情况]

工程目录介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
├─1-TestCase
│ 切换.txt

├─2-DOMElement
│ commonVariable.txt
│ HomePage.txt

├─3-Keywords
│ CanvasAW.txt
│ Common.txt
│ CommonAction.txt
│ CommonAssert.txt
│ CommonDriver.txt
│ CommonResolve.txt
│ CommonWait.txt
│ HomePage.txt
│ MemLeak.txt
│ UplSolo.txt

├─5-Extendlibrary
│ │
│ └─MemoryLeak
│ MemoryUtils.py
│ MemUsageExcel.py
graph LR
    切换.txt --> MemLeak.txt
    切换.txt --> UplSolo.txt
    MemLeak.txt --> MemUsageExcel.py
    MemUsageExcel.py --> MemoryUtils.py
  • UplSolo.txt:封装页面上的业务操作
  • MemLeak.txt:封装跟内存泄漏有关的动作,MemUsageExcel.py 所有的方法在此划分
  • MemUsageExcel.py:记录excel,调用MemoryUtils.py

曲折经历

进程号变化导致写excel数据不对齐

记录一开始的chrome进程,后续新增的进程不管,死掉的进程默认为0

精确内存需要在打开chrome时候新增参数

探讨

该方法是否真的能识别出内存泄漏?

  1. 系统进程级别比js占用多很多
  2. 系统进程级别的内存可能随应用当前页面展示的内容不同而(自动地)有所回落
  3. 更进一步的分析就需要对数据进行分析了,后话了

项目地址

https://github.com/Tony36051/js-mem-leak-test/

关键字默认参数是变量,也需要定义

1
2
登录
[Arguments] ${url}=${Url_A3} ${userName}=${User_A3} ${passWord}=${Password_A3}

如果这里的${Url_A3}没有定义,会报错Non-existing variable '${Url_A3}'.

打开chromedriver时候,增加(命令行)参数

1
2
3
4
${args_list}	Create List	user-data-dir=${OUTPUT DIR}${/}chrome_data	enable-precise-memory-info
${chromeOptions} Create Dictionary args ${args_list}
${cap_dict} Create Dictionary chromeOptions ${chromeOptions}
Open Browser ${url} chrome desired_capabilities=${cap_dict}

日常工作之一就是帮助合作方解决自动化问题, 今天的问题是python写的Robotframework扩展库ExcelRobot在读取xlsx报错, 同样的文件昨天还是OK的. 带着疑惑开始debug

阅读全文 »