# CalcInterfaceCount **Repository Path**: link_galaxy/calcinterfacecount ## Basic Information - **Project Name**: CalcInterfaceCount - **Description**: 根据项目服务日志统计接口请求次数。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-08-09 - **Last Updated**: 2022-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 根据日志统计接口请求次数 背景:领导要求统计下设备接口端一个月接口请求的次数,因 skywalking 日志保存时间为7天,华为云 LTS 也只有 7天。所以诞生了下载服务器日志来进行统计的想法。 代码仓库地址 下图为单服务器,单设备接口服务一个月的日志量: ![输入图片说明](src/main/resources/96G.png) ![输入图片说明](src/main/resources/30%E5%A4%A9.png) ![输入图片说明](src/main/resources/image.png) # 使用说明 在 dev 配置文件中配置 日志文件的路径,然后整理好 URI 的 Excel 即可。需要注意 URI 能有效识别切唯一。还可以指定 URI + 关键字进行匹配 ![输入图片说明](src/main/resources/%E9%85%8D%E7%BD%AE.png) > 电脑配置:4核8线程 16G 执行参数:-Xmx4096m -Xms4096m PS + PO # 第一版 ## 业务逻辑 第一版就是多线程按行读取数据,定义一个 ConcurrentHashMap 用来存URI,每次匹配到数据就 +1;线程池用自定义的拒绝策略,执行拒绝策略保存任务到阻塞队列,当线程池队列任务少于一定数量再从阻塞队列拿任务重新提交。 ## 执行时间 10个文件执行速度:1分50秒(单个日志文件60M) 所有文件执行时间:2小时50分钟(哈哈哈,老板第二天就要数据先跑完交差)。 # 第二版 ## 业务逻辑 因怀疑在多线程 cas 处有浪费时间,所以去掉了并发容器。当 URI map 初始化后,给每个线程的 threadLocal 设置一个自己的 map,每次执行任务都设置一次,任务执行完做数据归并。拒绝策略提交任务处优化成了 poll() 不带时间参数的。 ## 执行时间 10个文件执行速度:1分45秒(单个日志文件60M) 所有文件执行时间:1小时32分钟 # 第三版 偶然从某书中看到,一般能不多线程就不多线程,故而使用一个线程测试10个文件速度是否有提升 ## 执行时间 10个文件执行速度:2分11秒(单个日志文件60M) > 运行时间增加,代码也就没有提交 # 第四版 优化单个线程扫描完成后计算数据,现改为所有任务执行完成后进行数据汇总。去掉集合切割和并行流, 并行流会维护一个ForkJoinThreadPool,在 cpu 密集型多开线程没意义 ## 执行时间 10个文件执行速度:1分52秒(单个日志文件60M) > 运行时间减少的不多,但是数据最终进行计算的话,线程只负责读取执行文件读取速度应该有所提升 # 第五版 从GC 方面优化 下图为第四版代码运行10个文件的GC图 ,目前启动配置为:-Xmx4096m -Xms4096m, 沒做任何优化 ![输入图片说明](src/main/resources/第四版GC图.jpg) > 优化语雀地址:https://www.yuque.com/docs/share/39dd6d87-bcda-42a1-9343-ae125a173711?# 《日志读取 GC 调优》 > 理论内存越大速度越快,但是还是定在4GB做测试 ## 优化后启动参数 -Xmx4096m -Xms4096m -Xmn3072m -XX:SurvivorRatio=1 # 其他优化 1. 原本打算使用 FileChannel + DirectByteBuffer 减少拷贝次数,但是日志辨识度太低了,只有用关键字 + URI 来扫码行,不能通过某个关键字来直接判断。 2. 测试发现 cpu 密集型,当线程达到一定数量后继续加效果不明显,所以还是多少核多个线程 coreSize = (Runtime.getRuntime().availableProcessors()); 3. 调整过新生代比例 + 其他GC收集器(CMS,G1)依旧效果不明显。