扣钉日记

其他

接口偶尔超时,竟又是JVM停顿的锅!

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介继上次我们JVM停顿十几秒的问题解决后,我们系统终于稳定了,再也不会无故重启了!这是之前的文章:耗时几个月,终于找到了JVM停顿十几秒的原因但有点奇怪的是,每隔一段时间,我们服务接口就会有一小波499超时,经过查看gc日志,又发现JVM停顿了好几秒!查看safepoint日志有了上次JVM停顿排查经验后,我马上就检查了gc日志与safepoint日志,发现如下日志:$
2022年6月19日
其他

密码学入门

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介在信息安全领域,一般会遇到"窃听"、"篡改"、"伪装"、"否认"这些威胁,而密码学家们提供了相应的密码学算法来解决这些问题,如下:窃听:攻击者可以在网络上安置了一个路由器,侦听所有经过的数据包,这样数据就被泄密了,密码学提供了对称密码与公钥密码算法对数据加密,保证机密性。篡改:攻击者对经过的数据包进行修改,使得接收方获取到错误的信息,密码学提供了单向散列函数生成“数据指纹”,保证数据完整性。伪装:攻击者伪装成发送方来发送数据,使得接收方获取到虚假的信息,密码学提供消息认证码生成"认证码",保证数据来源的正确性。否认:发送方本身是攻击者,发送了恶意请求后,谎称自己没有发此请求,密码学提供了数字签名算法,使其不可否认。像对称加密、公钥加密、消息散列、消息认证码、数字签名这些算法,也被称为密码学家的工具箱。加密分类现如今的加密算法,主要分为两大类,一类是对称加密,而另一类是非对称加密,而对称加密在实现方式上又可以分为两类,一类是分组加密算法,另一类是流加密算法。分组加密分组加密(block
2022年4月29日
其他

神秘的backlog参数与TCP连接队列

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这要从一次压测项目说起,那是我们公司的系统与另几家同行公司的系统做性能比拼,性能数据会直接影响项目中标,因此压力非常大。当时甲方给大家提供了17台服务器供系统部署,并使用LoadRunner对系统进行压测,乙方有完全的服务器使用权,甲方派一个人负责压测并记录性能数据,要求压测QPS不低于4000。项目开工接收到项目后,我们leader作为本项目的技术负责人,很快就为本项目指定了架构,web层使用nginx作为负载均衡,应用层使用weblogic服务器(理解为类似tomcat的东西即可)集群,数据库使用Oracle
2022年3月5日
其他

耗时几个月,终于找到了JVM停顿十几秒的原因

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介最近我们系统出现了一些奇怪的现象,系统每隔几个星期会在大半夜重启一次,分析过程花费了很长时间,令人印象深刻,故在此记录一下。第一次排查由于重启后,进程现场信息都丢失了,所以这个问题非常难以排查,像常规的jstack、jmap、arthas等都派不上用场,能用得上的只有机器监控数据与日志。在看机器监控时,发现重启时间点的CPU、磁盘io使用都会升高,但很快我们就确认了这个信息无任何帮助,因为jvm启动会由于类加载、GIT编译等导致CPU、磁盘io升高,所以这个升高是重启本身导致的,并不是导致问题的原因。然后就是分析业务日志、内核日志,经过一段时间分析,结论如下:在重启的时间点,系统流量并没有明显上升。在dmesg日志中并没有找到oom-killer的痕迹,虽然这经常是导致进程莫名重启的原因。由于部署平台也可能会kill掉进程(当进程不响应健康检查请求时),我们也怀疑是它们的误杀,但运维同学认为不可能误杀。问题没有任何进一步的进展了,由于没有任何进程现场,为了排查问题,我开发了一个脚本,主要逻辑就是监控CPU、内存使用率,达到一个阈值后自动收集jstack、jmap信息,脚本部署之后就没继续排查了。第二次排查部署了脚本之后,过了几个小时,进程又重启了,但这次不是在大半夜,而是白天,又开始了排查的过程...在这次排查过程中,我突然发现之前漏掉了对gc日志的检查,我赶紧打开gc日志看了起来,发现了下面这种输出:Heap
2022年2月26日
其他

Linux命令拾遗-理解系统负载

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这是Linux命令拾遗系列的第七篇,本篇主要介绍Linux中负载的概念与问题诊断方法。本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇Linux命令拾遗-软件资源观测Linux命令拾遗-硬件资源观测Linux命令拾遗-剖析工具Linux命令拾遗-动态追踪工具一般在类unix系统上,都会有系统负载(load
2021年12月4日
其他

Linux命令拾遗-动态追踪工具

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这是Linux命令拾遗系列的第六篇,本篇主要介绍工作中常用的动态追踪工具strace、arthas、bpftrace等。本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇Linux命令拾遗-软件资源观测Linux命令拾遗-硬件资源观测Linux命令拾遗-剖析工具之前介绍了一些线程与内存剖析工具,如jstack、pstack能很容易观测到线程被卡在了什么位置,而jmap、gcore则容易排查内存泄露、oom等问题。但线程与内存剖析,只能观测到进程的整体情况,有些时候我们需要观测到某一方法级别,比如调用方法test()时,传入的参数是什么,返回值是多少,花费了多少时间?这种情况下,我们就需要使用一些动态追踪工具了,如strace、arthas、bpftrace、systemtap等。strace与ltracestrace是Linux中用来观测系统调用的工具,学过操作系统原理都知道,操作系统向应用程序暴露了一批系统调用接口,应用程序只能通过这些系统调用接口来访问操作系统,比如申请内存、文件或网络io操作等。用法如下:#
2021年11月14日
其他

Linux命令拾遗-剖析工具

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这是Linux命令拾遗系列的第五篇,本篇主要介绍Linux中常用的线程与内存剖析工具,以及更高级的perf性能分析工具等。本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇Linux命令拾遗-软件资源观测Linux命令拾遗-硬件资源观测像vmstat,top等资源观测命令,只能观测到资源整体使用情况,以及在各进程/线程上的使用情况,但没法了解到进程/线程为什么会使用这么多资源?这种情况下,可以通过剖析(profile)工具做进一步分析,如jstack,jmap,pstack,gcore,perf等。jstackjstack是JVM下的线程剖析工具,可以打印出当前时刻各线程的调用栈,这样就可以了解到jvm中各线程都在干什么了,如下:$
2021年11月8日
其他

Linux命令拾遗-硬件资源观测

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这是Linux命令拾遗系列的第四篇,本篇主要介绍Linux中观测硬件资源的命令,如top、vmstat、pidstat、iostat、sar等。本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇Linux命令拾遗-软件资源观测CPU与内存观测vmstatvmstat全名是虚拟内存统计信息命令,看起来好像是用来观测内存的,实际上cpu、内存、io资源它都能观测。$
2021年11月1日
其他

Linux命令拾遗-软件资源观测

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这是Linux命令拾遗系列的第三篇,本篇主要介绍Linux中观测软件资源的命令,如ps、netstat、lsof,以及查看进程信息的宝库/proc目录。本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇系统资源常分为两类,一类是软件资源,如进程、线程、文件描述符、socket连接,偏开发视角,另一类是硬件资源,如CPU、内存、硬盘、网络,偏运维视角,而本章主要介绍Linux中与观测软件资源有关的命令。ps查看进程相关信息相信ps命令大家也比较熟悉,主要是用来列出进程的,基本用法如下:#
2021年10月22日
其他

Linux命令拾遗-文本处理篇

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介这是Linux命令拾遗系列的第二篇,本篇主要介绍Linux中与文本处理相关的命令,如xargs、grep、sed、awk等。本系列文章索引Linux命令拾遗-入门篇常用文本相关命令cat、tac、less#
2021年10月15日
其他

Linux命令拾遗-入门篇

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介之前出过很多和Linux命令有关的文章,但都比较零散,故打算出一个Linux系列文章,一步一步带出Linux中纷繁复杂的命令知识。本篇是第一章,主要讲解Linux命令基本使用,并带认识一些最基础的Linux命令使用。基础知识当我们打开终端时,终端软件会为我们打开一个shell软件,这个shell会显示一个提示符,然后等待用户输入命令,类似下面这个:然后我们就可以在这个界面中执行Linux命令了,shell做为一个命令解释器,它会解释并执行用户输入的命令。这种shell有多种,如sh、csh、tcsh、zsh、fish、bash,而目前Linux环境中使用得最广泛的就是bash。命令参数与选项Linux命令基本都是如下的形式:cat
2021年10月10日
其他

shell管道咋堵住了?

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。背景起因是这样的,我们想开发一个小脚本,当cpu使用率过高时,使用jstack将java的线程栈保存下来,以便后面分析。获取cpu使用率获取cpu使用率是比较容易的,使用vmstat就可以了,第15列id就是cpu空闲率,用100减一下,就是cpu使用率了。于是,我使用如下命令获取了cpu使用率,发现能获取到,如下:vmstat
2021年9月30日
其他

这grep咋还不支持

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介对于刚使用Linux不久的同学,肯定会遇到这个问题,就是用grep匹配数字时,发现\d匹配不了数字。主要原因是grep支持三种正则表达式BRE,ERE,PCRE,而其默认使用的是BRE,但\d是定义在PCRE中的,所以grep默认是不支持\d的。正则表达式分类BRE基本的正则表达式(Basic
2021年9月25日
其他

使用Linux命令快速查看某一行

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介当年,我还是Linux菜鸟的时候,就在简历上写着精通Linux命令了,而当面试官问我“如何快速查看某个文件的第200行,仅这一行”时,我的心里是懵逼的。当时面试官心里估计在窃喜,从我敷衍的回答中,他应该已经完全了解到了我的Linux水平如何[-_-]不过,不得不说,这是一道非常好的面试题,对于一些只知道cd
2021年9月19日
其他

mysql的timestamp会存在时区问题?

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介众所周知,mysql中有两个时间类型,timestamp与datetime,但当在网上搜索timestamp与datetime区别时,会发现网上有不少与时区有关的完全相反的结论,主要两种:timestamp没有时区问题,而datetime有时区问题,原因是timestamp是以UTC格式存储的,而datetime存储类似于时间字符串的形式,示例博文:MySQL
2021年9月12日
其他

hex,base64,urlencode编码方案对比

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介在工作过程中,我们慢慢会了解到hex、base64、urlencode这3种常见的字节编码方案,它们是如此的熟悉,可是经常我们自己也说不清为啥要使用它们,下面我会详细解释下。hex编码hex编码,又称十六进制编码(也称base16),一般用于方便人们查看二进制文件内容,它将字节数据中的每4个bit使用数字(0-9)、字母(A-F)共16个字符等效表示,由于一个字节有8个bit,所以一个字节会被编码为2个hex字符,具体规则如下:
2021年9月10日
其他

字符编码解惑

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介现代编程语言都抽象出了String字符串这个概念,注意它是一个高级抽象,但是计算机中实际表示信息时,都是用的字节,所以就需要一种机制,让字符串与字节之间可以相互转换,这种转换机制就是字符编码,如GBK,UTF-8所以可以这样理解字符串与字符编码的关系:字符串是一种抽象,比如java中的String类,它在概念上是编码无关的,里面包含一串字符,你不需要关心它在内存中是用什么编码实现的,尽管字符串在内存中存储也是需要使用编码机制的。字节串才需要关心编码,当我们要将字符串保存到文件中或发送到网络上时,都需要使用字符编码机制,将字符串转换为字节串,因为计算机底层只认字节。常见字符编码方案ASCII全称为American
2021年9月5日
其他

真正理解可重复读事务隔离级别

update为当前读,即读取最新的数据,普通的select则是快照读,在mysql中insert、update、delete、select
2021年7月17日
其他

20个常用的Linux工具命令

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介网上有很多辅助开发的小工具,如base64,md5之类的,但这些小工具其实基本都可以用Linux命令实现,即方便又高效。1.查看特殊字符把这个放在首位,是因为这个实在太重要了,程序经常会因为特殊的看不见的字符而出现bug,因此一些本应该执行正确而实际出乎意料的字符串处理,你都应该看看是否含有特殊字符。$
2021年3月15日
其他

Linux文本命令技巧(下)

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介前一篇介绍了Linux中一些基本的文本命令与使用技巧,但是结合场景过少,本篇结合工作中一些常见的场景介绍一些技巧。数据提取数据提取在文本处理中是常见,提取单个值可以使用grep
2021年1月30日
其他

Linux文本命令技巧(上)

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介前一篇我介绍了awk,这是一个全能的文本处理神器,因为它本身就是一门编程语言了,但对于很多场景,使用Linux预设的一些文本处理命令,会更方便快捷,如grep、sed等。本篇就来介绍一下Linux上常用的文本处理命令,由于内容较多,分为上下两篇,这里是上篇。查看文本内容主要包含cat、less、grep、head、tail,请看示例:#
2021年1月24日
其他

原来awk真是神器啊

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介刚开始入门awk时,觉得awk很简单,像是一个玩具,根本无法应用到工作之中,但随着对awk的了解不断加深,就会越发觉得这玩意的强大,大佬们称其为上古神器,绝不是空穴来风。这也可以说明,一些热门的技术知识点,如果你觉得它不过如此,那绝对是你对它的掌握不够深入,而不是它没啥用。基本语法awk基本语法如下:awk
2021年1月17日
其他

不容易自己琢磨出来的正则表达式用法

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介现如今,正则表达式几乎是程序员的必备技能了,它入手确实很容易,但如果你不仔细琢磨学习,会长期停留在正则最基本的用法层面上。因此,本篇文章,我会介绍一些能用正则解决的场景,但这些场景如果全自己琢磨实现的话,需要花一些时间才能完成,或者就完全想不出来,另外也会介绍一些正则表达式的性能问题。匹配多个单词比如我想匹配zhangsan、lisi、wangwu这三个人名,这是一个很常见的场景,其实在正则里面也算基本功,但鉴于本人初入门时还是在网上搜索得到的答案,还是值得提一下的!实现如下:zhangsan|lisi|wangwu其中|表示或的含义,就是匹配zhangsan或lisi或wangwu了。匹配重复数字匹配如1111、2222、3333这样的4位长度的重复数字,突一想,这不用\d{4}就解决了嚒,其实不然,因为\d{4}可以匹配1111,但也可以匹配1234啊。写法如下:(\d)\1{3}\d匹配第一个数字,后面的\1匹配前面\d匹配的内容,重复3次,这样就可以匹配1111或2222这样的4位数字串了。匹配各种空白在使用正则时,常用\s来匹配空白,但遗憾的是,还是有一些Unicode的空白字符,\s无法匹配,这时可以尝试POSIX字符类\p{Space},我在Java中验证通过,可以匹配ascii空白字符与Unicode空白字符,如果是其它语言的话,可能正则语法会稍有区别。位置匹配正则表达式中\G与环视是比较难理解的,因为这两个东西很多书上只是介绍了匹配的规则,没有说出实质,导致死记的规则过一段时间就忘,也不明白这两东西有啥用。我们转换一下思维,其实在正则表达式中,匹配目标只有两个,一是匹配字符串中的字符,二是匹配字符串中的位置,如下图:上边的hello,有5个字符可以匹配,另外还有6个位置可以匹配,而^hello中^就是代表匹配开头的位置,所以如果是_hello就无法被^hello匹配,因为_与h之间的位置并不是开头,不能与^匹配!常见位置匹配规则规则匹配的位置^
2020年12月25日
其他

好用的parallel命令

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介有时,我们需要处理一批数据,使用while循环是个不错的想法,但while循环中的命令是一个一个执行的,如果要批量处理的数据很多,执行时间就会很长,而parallel可以让命令并行执行,从而缩短命令执行时间。下面,我们先用ncat来模拟一个处理数据的接口。模拟接口ncat
2020年12月19日
其他

常用网络命令总结

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。网络连通性检测当应用出现网络异常时,首先需要确认的就是网络的连通性是否正常,下面一组命令可快速检测网络的连通性,如下:检测DNSdig
2020年11月15日
其他

我都调通了,为啥你不行?

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。场景有时我们开发了一个api接口,自己调得好好的,接口文档也写好了,但别人调用时就是有问题,而当我们调试时,发现请求根本没进来或进来了却取不到调用参数,该怎么告知对方调用姿势哪不对呢?解决方法对于编码新手,一般会和对方撕扯一会,然后甚至去review对方的代码,这样也许能解决问题,但自己毕竟不熟悉别人系统的实现,耗费时间较长。另外api调用端可能因为封装方式不同或者加过一些拦截器,导致你看调用端的代码根本看不到什么问题,或者因为调用参数有一些不易分辨或不可见的特殊字符,让你无法察觉到这里有问题。其实这种问题,我们从网络层出发,对比自己正确调用时的数据包与对方错误调用时的数据包内容,以此来诊断问题所在更加高效,毕竟任何封装或拦截器的处理,最终都会反馈在底层的交互数据上。这里,我使用springmvc开发一个简单的接口,如下:@RestControllerpublic
2020年10月11日
其他

还在胡乱设置连接空闲时间?

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。场景写过一段时间代码后,对连接池应该不会陌生,MySQL、HttpClient、MQ等这些都需要连接池,而一般来说,服务端程序会自动断开长时间不交互的连接,但TCP连接本身是无法感知到对端关闭的,因此连接池组件一般都需要配置一个空闲时间,连接池组件需要根据这个值来判断连接是否存活,那么该怎么配置此值呢?检测服务端空闲断连时间首先最容易想到的,就是使用抓包软件了,比如wireshark,根据TCP连接时会发SYN包,断开时会发FIN包,只需要用FIN包的时间减去SYN包的时间,就是服务端允许的空闲时间值,但这种方法稍微有点麻烦。但我们可以使用telnet命令来检测,如下:$
2020年10月4日
其他

使用socat批量操作多台机器

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。场景很多时候,我们需要批量操作多台机器,业界一般使用Ansible来实现,但使用Ansible来操作多台机器的前提是需要有ssh权限的,可悲的是,对于开发人员来说,一般是没有正式环境机器的ssh权限的,只能通过一个指定的入口登录机器,也可以理解,毕竟正式环境如此重要。不过,如果你的生产环境可以访问你的开发机,那么可以通过反向Shell来访问机器,然后将反向Shell与tmux结合,又可实现同时操作多台机器的效果,这就是本文要介绍的。正反向Shell如果你了解过nc命令,一定听说过nc可以建立正向或反向Shell,这里就不解释正向或反向Shell的概念了,解释不清,直接上nc实现正向Shell与反向Shell的例子。由于nc命令本身存在模糊性,有些文章介绍的nc命令是ncat,有些文章介绍的nc命令又是netcat,这两个还是有些差别的,故这里的例子,直接使用ncat避免混淆。开发机ip为192.168.0.10
2020年9月20日