记一次udp服务性能优化经历
目录
- 概述
- 磁盘io
- 网络io
- 减少重复计算
- 减少内存复制
- 减少互斥锁
概述
手上有个go项目,接收udp信息(主要是syslog和snmp trap)并查询设备信息,将信息结构化(设备ip名称,匹配了什么规则之类的)后发送到kafka和es。
本身项目是基于benshos进行开发的,但是整体性能并不那么让人满意,而且还存在丢包的问题(udp缓冲区拿数据太慢导致数据丢失了)。整个性能优化过程比较有意义,所以整理一篇文章记录下来。
性能优化核心思想就是如下几条:
- 减少磁盘io
- 减少网络io
- 减少重复计算
- 减少内存复制(主要是io次数)
- 减少互斥锁
磁盘io
首先进行优化的是,批量写入es和kafka的量级,之前是批量100条写入,直接修改为1000条,网络io次数减少了9/10,整体性能也大大提升。
后面优化就比较麻烦了,根据pprof的火焰图,发现trap插件存在过多写入日志的问题,火焰图如下:
查看snmp源码,发现会在创建连接的时候传入一个log接口,我直接写了一个假的接口,跳过输出,火焰图表现好了很多,大致如下:
不太想动benthos和snmp的代码,所以这里日志输出比之前好太多了。
根据磁盘io的思路,我去排查我的所有日志模块,对所有有日志打印的地方进行了优化,将没必要的日志输出全部删除。
衡量io是否还有优化空间的方式之一是看cpu利用率是否打满了(在不考虑算法的情况下)。
网络io
网络io方面,一部分是kafka和es输出的io次数,另一个是每条udp信息都要去查询相关设备信息。虽然走的redis,并且加了锁,但是性能还是很低。
最开始的思路是通过读写锁+map的方式做缓存,后来发现这个问题很大,主要是并发太高的情况下,写入设备信息需要互斥锁,导致所有线程都无法去读取相关信息。后来想用sync.Map,但是性能还是不好(测试每次都用不同的设备ip来查,缓存基本不生效,每次都是新的ip)。最后做了一个go程,每过一段时间去redis更新设备信息,并将设备信息全部缓存到本地的map。将更新设备信息和读取分离,这样查询不到设备信息的情况下不会直接查redis,大大提升了性能。(至于redis能不能扛得住,影响不大,每次设备更新是单独执行,慢点就慢点)。
减少重复计算
这块主要是对代码本身不合理的地方进行优化,主要工作如下:
- 将可以缓存的信息全部缓存,不要重复计算
- 减少udp接收数据的处理过程,先用channel发送出去,如果间隔的udp接收时间过长可能会导致中间的缓冲被覆盖。
减少内存复制
主要是减少不必要的指针使用。
减少互斥锁
互斥锁影响很大,一定要想办法去除,或者尽量减少互斥锁的加锁次数。
写作过程中被打断了,,思路全没了。先这么着吧。
另外要学会使用pprof,特别是看那些图片。
相关文章:
记一次udp服务性能优化经历
目录 概述磁盘io网络io减少重复计算减少内存复制减少互斥锁 概述 手上有个go项目,接收udp信息(主要是syslog和snmp trap)并查询设备信息,将信息结构化(设备ip名称,匹配了什么规则之类的)后发送…...
uniapp和VueI18n多语言H5项目语言国际化功能搭建流程
uniapp多语言项目国家化功能搭建流程 说明:uniapp多语言项目功能搭建分为应用部分和框架部分。 应用部分,即开发者自己的代码里涉及的界面部分的语言翻译。框架部分,即uni-app内置组件和API涉及界面的部分的语言翻译。 功能的搭建是需要un…...
C# | 凸包算法之Jarvis,寻找一组点的边界/轮廓
C#实现凸包算法之Jarvis 文章目录 C#实现凸包算法之Jarvis前言示例代码实现思路测试结果结束语 前言 这篇关于凸包算法的文章,本文使用C#和Jarvis算法来实现凸包算法。 首先消除两个最基本的问题: 什么是凸包呢? 凸包是一个包围一组点的凸多…...
SpringBoot接收请求参数的方式
【方式一】原始方式 因为SpringBoot封装了Servlet,所以也允许使用HttpServletRequest类中的方法来获取 /*** 【方式一】原始方式*/RequestMapping("/demo01")public String demo01(HttpServletRequest request) {// 参数名要与页面提交的参数名一致Strin…...
MKS SERVO4257D 闭环步进电机_系列5 CAN指令说明
第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈&am…...
安捷伦E4440A(Agilent) e4440a 3HZ-26.5G频谱分析仪
Agilent E4440A、Keysight E4440A、HP E4440A频谱分析仪,3 Hz - 26.5 GHz(PSA 系列) Agilent / Keysight PSA 系列 E4440A 高性能频谱分析仪提供强大的一键式测量、多功能功能集和前沿技术,可满足您的项目和需求。选项可供您选…...
华为OD机试真题 Java 实现【最长子字符串的长度】【2022Q4 100分】,附详细解题思路
一、题目描述 给你一个字符串s,字符串s首尾相连组成一个环形,请你在环形中找出‘o’字符出现了偶数次最长子字符串的长度。 二、输入描述 输入一串小写字母组成的字符串。 三、输出描述 输出一个整数。 四、解题思路 题目要求在给定的环形字符串中找出字符’o’出现了…...
【iOS】--对象的底层结构
源码 先转一下源码 //#import <Foundation/Foundation.h> #import <objc/runtime.h>interface LGPerson : NSObject property (nonatomic, strong) NSString *KCName; endimplementation LGPersonendint main(int argc, const char * argv[]) {autoreleasepool {…...
高并发内存池设计_内存池
高并发内存池设计 1. 常用的内存操作函数2. 高性能内存池设计_弊端解决之道弊端一弊端二弊端三弊端四3. 弊端解决之道内存管理维度分析内存管理组件选型4. 高并发内存管理最佳实践内存池技术内存池如何解决弊端?高并发时内存池如何实现?5. 高效内存池设计和实现实现思路 (分而…...
给编程初学者的一封信
提醒:以下内容仅做参考,具体请自行设计。 随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢?欢迎大家积极讨论 一、自学编程需要注意什么? 要有足够的时间、精力等…...
【无功优化】基于改进教与学算法的配电网无功优化【IEEE33节点】(Matlab代码时候)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
数据在内存中的存储(超详细讲解)
目录 浮点数家族 浮点数类型在内存中的存储 一.为什么说整型和浮点数在内存中存储方式不同(证明) 二.浮点数的存储规则 浮点数在计算机内部的表示方法 1.对于M的存储和取出规则 2.对于E的存储和取出时的规则 对前面代码结果进行解释: …...
log4cplus使用示例
1、l4jlog.h封装头文件 #pragma once#include <iostream> #include <log4cplus/logger.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/fileappender.h> #include <log4cplus/layout.h> #include <log4cplus/configurator.h&…...
人工智能学习07--pytorch20--目标检测:COCO数据集介绍+pycocotools简单使用
如:天空 coco包含pascal voc 的所有类别,并且对每个类别的标注目标个数也比pascal voc的多。 一般使用coco数据集预训练好的权重来迁移学习。 如果仅仅针对目标检测object80类而言,有些图片并没有标注信息,或者有错误标注信息。…...
learnOpenGL-深度测试
深度测试:OpenGL将一个片段的深度值与深度缓冲的内容进行对比。执行一个深度测试,测试通过则深度缓冲将会更新为新的深度值。测试失败则片段被丢弃。 深度测试片段着色器及模版测试之后执行。 片段着色器中内置变量gl_FragCoord的z值即为深度值。 提前深…...
阿里云服务器数据盘是什么?系统盘和数据盘区别
阿里云服务器系统盘和数据盘有什么区别?系统盘类似Windows电脑的C盘,数据盘相当于其他盘符,数据盘可以有多个而系统盘只能有一个,数据盘可有可无而云服务器系统盘是必须要有的。阿里云服务器网来详细说下阿里云服务器数据盘和系统…...
linux常用命令精选
参考文章: Top 60 Linux Interview Questions and Answers - howtouselinux 在管理和维护Linux系统时,有一些常用的命令可以帮助您进行系统初始化和配置。这些命令涵盖了各种任务,包括系统设置、用户管理、软件安装和网络配置等。 本文将为…...
人体行为足力特征分析及其应用研究_kaic
第一章 绪论 随着社会现代化的发展和科技的不断进步,我国航天事业蓬勃发展,与此同时产生了很多亟待解决的难题,康复医疗成为航天医学和康复领域的重要课题之一。载人航天实践证明,失重对航天员生理功能有很大影响,这不…...
javascript基础二十七:说说 JavaScript 数字精度丢失的问题,解决方案?
一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false 为什么是false呢? 先看下面这个比喻 比如一个数 130.33333333… 这是一个除不尽的运算,3会一直无限循环,数学可以表示,但是计算机要存储,方便下次再使用,但…...
重塑工作场所:后疫情时代组织韧性的8个策略
经济寒冬来临,倒挂的收益率曲线、持续上升的利率以及层出不穷的裁员公告等等,让经济学家们得出一个结论:全球经济正在衰退。然而,经济下行周期可能是卓越公司改变其命运的最佳时机。有研究表明,相对于非经济衰退时期&a…...
8款实用AI论文生成工具(包括爱毕业aibiye)及新手详细指南
在学术研究领域,AI技术的应用显著提升了论文写作的效率与质量。以下推荐8款功能强大的智能工具,涵盖文献解析、内容生成、文本优化等关键环节,助力研究者高效完成从资料收集到论文润色的全流程工作。这些创新解决方案能够有效简化研究过程&am…...
K8s定时任务实战:如何用CronJob每分钟输出Hello World(附表达式详解)
K8s定时任务实战:从Hello World到生产级CronJob配置 在云原生技术栈中,定时任务作为自动化运维的核心组件,其重要性不言而喻。Kubernetes提供的CronJob资源,让开发者能够以声明式的方式管理周期性任务,而无需依赖传统…...
深入解析SSL/TLS握手协议:从理论到Wireshark实战分析
1. SSL/TLS协议的前世今生 每次在浏览器地址栏看到那个小锁图标,你有没有好奇过它背后是怎么工作的?这就是SSL/TLS协议在保护我们的数据安全。SSL(安全套接层)和它的继任者TLS(传输层安全)就像网络世界的&q…...
LogonTracer核心功能深度解析:4624、4625等关键事件ID的实战应用
LogonTracer核心功能深度解析:4624、4625等关键事件ID的实战应用 【免费下载链接】LogonTracer Investigate malicious Windows logon by visualizing and analyzing Windows event log 项目地址: https://gitcode.com/gh_mirrors/lo/LogonTracer LogonTrace…...
忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南
忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南 1. 认识忍者像素绘卷 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,它将忍者的热血意志与16-Bit复古游戏美学完美融合。这款工具采用明亮的"云端"视觉设计,…...
Cortex-M为何不能运行Linux?解析ARM架构与操作系统的兼容性
1. Cortex-M与Linux的兼容性解析作为一名在嵌入式领域摸爬滚打多年的工程师,我经常被问到这个问题:"为什么我的STM32(基于Cortex-M内核)不能跑Linux?"要回答这个问题,我们需要从处理器架构和操作…...
从原理到实战:PID位置式、增量式与串级PID的嵌入式实现与调参指南
1. PID控制算法基础:从生活场景理解控制原理 想象一下你正在用淋浴洗澡,发现水温太烫时的自然反应:首先会快速把阀门往冷水方向调(比例控制),如果水温还是偏高,你会持续微调阀门(积分…...
0基础SEO优化的关键点有哪些
0基础SEO优化的关键点有哪些 在互联网时代,SEO(搜索引擎优化)已经成为了每一个网站运营者必须掌握的一项技能。特别是对于0基础的SEO优化者来说,这是一条充满挑战但也充满机遇的道路。0基础SEO优化的关键点有哪些呢?本…...
软件实施交付转运维学习第三天:Linux系统命令基础(部分)
从实施到运维的蜕变之路,掌握命令就是掌握Linux的灵魂写在前面作为一名从软件实施交付转向运维的工程师,我深刻体会到:Linux命令不仅仅是简单的指令,更是与操作系统对话的语言。当我们站在实施和运维的交界处,掌握Linu…...
CLIP 实战宝典:从零开始掌握文本与图像编码的终极技巧
1. CLIP模型基础入门:图文匹配的魔法钥匙 第一次听说CLIP模型时,我正被一个图像搜索项目折磨得焦头烂额。传统方法需要先标注海量数据,再训练复杂的分类器,整个过程就像用算盘计算火箭轨道。直到遇见CLIP,才发现原来图…...
