- 博客(183)
- 资源 (1)
- 收藏
- 关注

原创 Linux里的容器被OOM killed的两种情况
生产上遇到了一些容器实例被OOM的现象,总结一下OOM的两种触发条件。我的虚拟机是ubuntu 24.0.4版本,分配4G内存,在我的虚拟机上复现这两种case。
2025-02-06 13:55:19
861

原创 高性能Server的基石:reactor反应堆模式
业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都是用的reactor反应堆模型。前置知识。
2024-02-23 15:24:32
1618

原创 InnoDB底层存储结构探秘
B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树1)有n棵子树的节点中含有n个关键字(即每个关键字对应一棵子树);2)所有叶子节点中包含了全部关键字的信息, 及指向含这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接;3)所有的非终端节点可以看成是索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字4)除根节点外,其他所有节点中所含关键字的个数必须>=⌈m/2⌉(注意:B-树是除根以外的所有非终端节点至少有⌈m/2⌉棵子树)上图是所示为一棵3阶的。
2022-11-27 17:00:17
1025

原创 业务架构浅谈
一、序章 一般的工程师接触到的是 应用架构 ,传统的MVC分层架构、事件驱动架构等等。第一次接触业务架构这个概念是在来到商品发布团队之后。商品发布是一个业务属性很重的系统,承载了淘宝、天猫、盒马、魅力惠、汽车、虚拟、SCM自营、苹果、村淘、公益、教育等诸多业务(业务多的围起来可以绕地球一圈)的商品发布功能。头半年对“业务架构”还是很懵逼的,随着慢慢的熟悉业务,研究框架代码,才对我们的业务架构.........
2022-07-13 16:44:47
5197
5

原创 redis rdb持久化源码分析
毕业7年后一直是Java选手,第一次这么认真的看C的源码。一、 redis的持久化方式redis是支持持久化的内存数据库(memcached不支持持久化)。其持久化的方式有两种,aof和rdb。rdb是一种快照式(snapshot)的持久化,直接把redis的内存整体写入磁盘文件。触发rdb持久化有两种方式,直接客户端调用bgsave命令或者固定时间内的写命令达到配置文件里的配置触发rdb持久...
2020-02-24 07:14:50
799
2

原创 应用部署技术发展简史
互联网企业生产环境的应用部署,大致分三个阶段。单物理机部署多个应用,虚拟机部署,容器化部署。一、物理机部署时代这是所有早期物联网公司必然经历的一个阶段。一台服务器,至少32核CPU、64G内存,如果只部署一个应用,那就太浪费了。于是,多个应用进程,DB,缓存进程等等都部署在同一个机器上。这种部署方式有一个最大的痛点:进程间资源抢占。如果一个进程耗用了100%的CPU资源,其他的进程无法...
2018-07-13 01:19:09
3183
3

原创 剖析金额不能用浮点数表示的原因
近期支援双十一红包项目。参与到了一个涉及到钱的项目,开发自然十分的谨慎。先抛出我有问题的代码,作用是把以分为单位的金额转成以元为单位的字符串。long adjustFee;String.valueOf(adjustFee / 100.0); 很自信的以为这行代码简洁明了的完成了使命。@壹双 同学review了我的代码后,指出这段代码会造成精度丢失的问题。先演示一个demo,构造一个浮点数丢失精度
2016-09-13 21:28:52
8977
7

原创 字符串的公共前缀对Mysql B+树查询影响回溯分析
年前项目组接微信公众号。上线之后,跟微信相关的用cid列的查询会话的SQL变慢了几十倍!思考这个问题思考了很久,从出现以来一直是我心头的一个结。cid这一列是建了索引的,普通的cid列更新都没问题,为何只有微信的有问题?相同的前缀又是如何影响索引的? 分析过程 1.explain下微信cid的查询,微信的cid会以mid-qqwanggou001为前缀插入数据...
2016-03-15 09:39:30
5501
10
原创 K8S中应用无法获取用户真实ip问题排查
摘要:生产环境出现用户IP显示为内部IP(172.30.94.97)的问题。排查发现:1) Nginx日志中remote_addr显示为内部IP,而真实IP存储在http_x_forwarded_for字段;2) Java代码优先读取了错误的X-Real-IP头(nginx配置错误传递了remote_addr);3) 因K8S双层Nginx架构(ingress+业务nginx),remote_addr只能获取上一层节点IP。解决方案是修改nginx配置,将X-Real-IP值从remote_addr改为ht
2025-06-11 23:14:34
407
原创 OutOfMemoryError unable to create new native thread
生产环境大量的报OutOfMemoryError: unable to create new native thread排查过程容器的request和limits都是4GB,用arthas查看进程内存,内存充足的查看数量查看pid_max和threads-max 等影响线程创建的参数在容器里面查,各种尝试下来都没有问题。直到有个同事提醒我,是不是线程数量超过了物理机的限制。我觉得很有道理,物理机上的容器用的是宿主机的资源,我们一个物理机上200多个pod。所有的容器的线程的总和超过物理机的限制是有
2025-02-21 16:16:36
799
原创 RSS远小于容器内存限制,却收到了内存告警
rss + cache + swap 的内存正好等于 memory.usage_in_bytes。pagecache的容量在进程内存不够用的时候,会随时被回收。找运维了解情况,运维说我们的内存监控取的是/sys/fs/cgroup/memory/memory.usage_in_bytes文件的值。jvm进程仅仅使用了1.2GB物理内存,但是查看k8s的监控,显示我的容器的内存使用了3.5GB。的确是3.5个GB,那么这个指标的计算公式是怎样的?早上收到容器实例内存超过80%的告警,进入容器实例排查。
2025-02-14 12:48:24
364
原创 pushgateway指标聚合问题
pushgateway是用请求pushgateway的url的path作为grouping-key的。如果不配置任何grouping-key,pushgateway会把所有job一样的指标聚合到一起。一个job有多个实例推送指标,但是从pushgateway上看这个job的instance字段,只显示一个实例的ip,而不是多个实例。增加grouping-key,避免多个不同的实例的指标被聚合。由于是本机debug,HostName这个环境变量取不到,k8s上正常。应用的prometheus的配置。
2025-02-05 17:06:35
656
原创 Native Memory Tracking 与 RSS的差异问题
jdk通过mmap申请的内存,是操作系统分配的虚拟内存,只有当Java应用程序实际写入时,OS才会分配物理内存。所以nmt和top的指标的差异如此明显。参考文章。
2025-01-31 22:45:30
592
原创 k8s部署rocketmq踩坑笔记
给团队部署一个rocketmq4.8.0. k8s上部署的broker,注册到nameserver上是自己的pod ip,导致本机连接到的broker的pod ip,这个ip k8s集群外的机器是无法联通的。k8s部署中间件,除了容器访问网络磁盘会导致性能问题外,还需要考虑注册到nameserver的是pod ip,导致开发环境连接不上的问题。尝试将broker的配置brokerIP1修改为注册到nameserver的地址。nameserver上注册的是这个pod ipv4。
2025-01-11 17:53:35
451
原创 OSS技术选型
它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。不需要购买任何专有硬件,就可以在云上和普通硬件上拥有分布式对象存储。我们组有算法团队,他们主要用python,Ozone并没有python客户端。Ozone 是一个分布式、多副本的对象存储系统,并针对大数据场景进行了专门的优化。Ozone 主要围绕可扩展性进行设计,目标是十亿数量级以上的对象存储。但是MinIO更加成熟,社区活跃度更高,在多家公司得到验证,建议使用MinIO作为我们的OSS服务中间件。
2024-12-07 16:03:07
801
原创 Web应用分层最佳实践
BO(Business Object): 业务对象, 可以由 Service 层输出的封装业务逻辑的对象。DO(Data Object): 此对象与数据库表结构一一对应, 通过 DAO 层向上传输数据源对象。web: 主要是对访问控制进行转发, 各类基本参数校验, 或者不复用的业务简单处理等,应用配置。VO(View Object): 显示层对象, 通常是 Web 向模板渲染引擎层传输的对象。service: 相对具体的业务逻辑服务层,以及rpc接口的实现层。第三方接口的封装,放在manager层。
2024-11-13 13:11:02
470
原创 Can‘t get Kerberos realm
近期搞Ozone开发,需要走kerberos登陆,遇到了一个问题,花了很长时间解决。记录一下,跟网上能搜到的不大一样。
2024-09-18 18:11:13
1259
原创 用ForkJoin框架为归并排序提速
写完之后,想到这个程序仅仅利用到了一个cpu核心,如果数据量很大的情况下,会造成计算资源的浪费。这个需要计算多个子任务的分治算法,明显可以用Fork/Join框架提速。当数据量小于1024个的时候不再进行切割,否则任务太多,提速效果十分差。当小于1024个的时候,偷懒用了工具库的快排。我的电脑是i7 4核心8线程,跑了10000, 100000, 1000000, 10000000, 100000000个数据对别单线程和多线程版本,运行结果。当数据量较大时,提速明显。归并排序典型的分治思想的算法。
2024-05-14 16:57:58
333
原创 camel丢失请求body问题排查
项目组要和被收购的公司做接口对接,使用camel进行集成。在使用的过程当中,我们几个小伙伴都遇到了一个相同的问题:请求request body的内容失踪了。
2023-12-18 19:25:15
1204
原创 MyPerf4J3.4+Influxdb2.7+grafana10.0接入方法监控
MyPerf4J的官方接入文档:https://github.com/LinShunKang/MyPerf4J。metrics.exporter配置成,注意后面别带冒号,我把后面的冒号复制过来后,排查了很久influxdb.database务必配置成,否则grafana要改动的地方很多debug = true,方便排查问题二 应用程序配置应用启动参数添加两项配置启动应用程序, 通过respStatus判断跟influxDB交互是否成功InfluxDB下载最新版本后启动influxdb,登
2023-10-20 10:42:19
833
1
原创 技术leader踩坑笔记:引入变化
人的习惯都是有惰性的,大家都喜欢用自己习惯的行为模式做事,如果要改变,就得重新适应环境。大到企业战略转型,小到仅仅是改变一个会议的方式,只要是引入变化,就会触发情绪反应,人们总是需要一个接受的过程。以为是好心,以为是办好事,以为自己责任心十分到位,以为是但是实践的过程,并不丝滑。新晋技术管理者要跳出资深开发的视野做事情,多站在项目的四类不同干系人的视角看问题,抓住他们的痛点,在大部分人接受的情况下达成共识。为了解决现状,引入一个新举措,作为新的技术leader,我的出发点没有问题。毕竟是基本的人性嘛。
2023-09-26 11:08:42
232
原创 JetBrains Annotations:将NPE杀死在编译期
搞过java开发的一定遇到过NullPointerException。这是个让人很头疼的问题。JetBrains 开发了一个注解库,通过在 IDE 里面提示开发者处理那些可能为 null 的值来解决这个问题,这个注解库就是JetBrains Annotations。代码写完时,test(name)这一行即飘红。编译并运行call方法,无法编译通过。
2023-09-20 18:02:30
491
原创 redis cluster集群搭建
然后copy到其他文件夹,记得改端口号,还有cluster-config-file的值,这个值不能重,必须唯一,否则无法启动。依然是3个主节点,但是7001已经失联,8002从slave变成了master。–cluster-replicas 1表示每个master一个slave。7001文件夹创建配置文件redis.conf。先停掉一个master 7001。启动6个独立的redis实例。确认是否全部启动成功。
2023-09-07 20:26:24
716
原创 K8S容器OOM killed排查
docker耗用完内存前,堆内存并没有达到上限,于是没有触发老年代GC,内存没有降下去。如果容器OOM killed,容器里的jvm进程没有Full GC,那么肯定是MaxRAMPercentage参数太高,导致堆内存没有用到上限,无法触发堆内存(老年代)GC。当实例内存超过95%时,对比top显示的的jvm进程内存和ps stats输出的docker实例内存信息,其余进程耗用的内存忽略不计。遂将内存增加到4GB。4 由于堆内存没有的到达上限,但是整个jvm进程内存超出了容器的内存限制。
2023-08-30 09:20:09
2771
原创 Nacos中map类型的配置
需要用nacos往bean里面注入一个map对象。如果直接用nacos的话,需要新开一个****.json的配置文件,个人觉得太麻烦。结合Spring EL表达式的功能,简单的实现了这个功能。java代码nacos配置。
2023-05-16 16:46:40
4339
2
原创 aop切面调用失效问题排查
应用里有较多的地方访问外部供应商接口,由于公网网络不稳定或者外部接口不稳定(重启,发版,ip切换)的原因,经常报502或者504错误。网上搜索有很多帖子反馈@Retryable注解不生效,不生效的点在于:切面切的方法,是在所在的类里被另外的方法调用的,而不是被外部类直接调用。不仅仅是@Retryable有这个问题,所有的切面实现的功能,如果这样调用都有问题。通过生成的类可以发现,如果直接调用没被代理的方法,那么调用的是父类SayHello的方法,也就是没被加强的方法。查看动态生成的类(第三个)
2023-05-04 23:08:42
1800
原创 业务架构与业务中台
在强大中台的有力支撑下,前端在进行业务运营和创新时会变得非常高效且灵活,企业可以根据最新的市场动态展开各种尝试和调整,一旦发现并验证了新的市场机遇,就可以调集中台的强大能力迅速跟进,抢占市场。系统真正运行的时候,取到的是组件和扩展点的对象,并不是代码。这样,代码复用,业务数据隔离。当新业务需要接入时,定义好一个业务身份,同时实现需要的SPI接口,即可完成业务的接入,同时做到业务的隔离。能够快速的支持新业务接入,让新的业务一起共建甚至新业务的同学独立的在XPF框架上接入他们的业务,是我们的目标之一。
2023-03-24 17:43:56
1993
原创 Mybatis中用typehandler优雅的解决枚举类型的读写
表字段是码值的时候,一般会有一个枚举(enum)类对应。我们可以把DO类的对应字段定义为枚举类型,用mybatis的typehandler来处理读写。通过枚举类强管控码值的变化,就不会随着时间的推移,代码的可读性和可维护性大大降低了。5 insert或者update的时候需要在字段后面带上typehandler。1 枚举字段类型定义, 我们的目标是直接把这个类型入库,并正确的读取出来。这样做之后,就只需要维护枚举类型,数据库字段和DO类的注释都不需要了。2 typehandler定义, 需要继承。
2022-08-19 17:35:52
806
原创 全链路参数透传
背景现在的系统大多是基于SOA的分布式应用。跨服务调用的时候,存在线程上线文里的重要信息如traceId,租户id无法传递给下一个应用。要解决的问题内部系统通过RocketMQ交互时,traceId如何透传到消息消费应用内部系统通过Dubbo调用时, traceId如何透传到服务提供方解决方案1 rocketMQ异步透传解决方案发消息时,通过切面拦截 DefaultMQProducer.send 方法,将traceId从threadLocal写入Message的properties里面
2022-03-28 10:40:12
3493
原创 MacOS Monterey根路径下创建目录的办法
Monterey版本根路径下创建文件夹apps,提示只读文件系统➜ / mkdir appsmkdir: apps: Read-only file system按以下方式可以解决:关机以安全模式启动mac,具体方法见Apple官方文档 https://support.apple.com/zh-cn/HT201262。M1芯片和X86芯片的安全模式启动方法不一样。找到终端工具,并执行 csrutil disable关掉mac的sip机制重启电脑查看sip,发现已被禁用。但是此时依旧无法
2022-02-12 15:44:22
3806
原创 人脸识别DEMO
前言写了一个用摄像头捕捉人脸匹配已知人脸的算法。包含两个主要的过程,人脸捕捉和人脸匹配。用的是github上的开源库 face_recognition。Recognize and manipulate faces from Python or from the command line with the world’s simplest face recognition library.这个人脸识别库号称天下第一简洁。使用前进行安装pip3 install face_recognition还
2020-07-08 17:57:40
1000
原创 redis aof持久化源码分析
redis的aof持久化方式有两个重要的组成部分增量写命令同步到磁盘aof文件全量重写一、增量同步1. 增量写命令追加到缓冲区redis有个缓冲区,未被写入磁盘的命令首先被存入缓冲区,达到条件后再写入磁盘struct redisServer { // sds 是redis定义的char数组 sds aof_buf; /* AOF buffer, written bef...
2020-02-29 20:17:52
987
3
原创 spring bean初始化耗时统计
spring bean 的生命周期实例化(instantiate), 用构造器创建一个对象字段赋值(populate)初始化(initialize), 执行bean配置里的init方法或者InitializingBean#afterPropertiesSet方法销毁(destruct)实例化和字段赋值一般都很快,但是一些重型的bean被IOC容器创建时,需要调用远程服务或者执行耗时的...
2020-02-20 23:30:06
4141
6
原创 antlr简单表达式语言入门
一、基本介绍antlr是一款适合拿来开发领域特定语言(DSL)的工具。它可以根据开发人员定义的词法和文法生成词法分析器(lexer)程序,语法分析器(parser)程序。如果没有antlr这样的工具,就要自己写底层的词法分析,语法分析,语义分析,中间代码生成等复杂的工作。antlr降低了dsl开发的复杂度。ANTLR (ANother Tool for Language Recognitio...
2020-02-18 13:18:51
2120
原创 dubbo服务导出的本质
当注册中心是zookeeper的时候,服务导出其实是在/root/interface/providers下创建一个临时节点,这个节点的路径就是服务的url。而取消注册就是将该节点删除。 // 服务注册 @Override public void doRegister(URL url) { try { // 创建临时节点 zkCl...
2020-01-08 11:24:04
513
原创 Hadoop MapReduce 入门实例
一、准备工作从hadoop官网下载了最新的3.1.2版本的hadoop配置hadoop相关的环境变量export HADOOP_HOME=/work/dev_tools/hadoop-3.1.2export PATH=$HADOOP_HOME/bin:$PATHexport HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar二、MapReduc...
2019-09-04 03:15:27
348
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人