实战系列
文章平均质量分 81
实战系列
恐龙弟旺仔
保持热爱,保持进步
展开
-
Socket常见异常场景模拟实战
如标题所示,本文主要罗列下Socket编程中的那些常见异常,通过实战的方式来模拟这些异常。原创 2022-09-17 15:31:43 · 1195 阅读 · 0 评论 -
HTTP协议解析与实战
HTTP(HyperText Transfer Protocol)超文本传输协议,它是用于从服务器传输超文本到本地浏览器的一种传输协议。按照七层传输协议,HTTP位于应用层协议,在TCP协议之上。如下图所示。原创 2022-08-18 19:40:12 · 518 阅读 · 0 评论 -
TCP零窗口探测实战
当接收端的接收窗口被完全占用后,此时再来新的数据包就无处安放了,同时接收方回复给发送方的ACK中,Win也已经归零。上一文的示例中,接收端接收到消息后,并不处理,所以会一直占用接收端的接收窗口,一直到最后,完全占用了接收窗口。当接收方重新获取可用空间时,会给发送端传输一个窗口更新,发送端接收到该数据包之后,继续发送数据。假设一种情况,接收方发送窗口更新包丢失了,那么发送端就一直无法得到窗口更新的消息,一直在等待。为了避免这种互相等待的死锁情况,发送端会采用一个持续计时器,间歇性的查询接收端的窗口信息。...原创 2022-08-18 19:35:59 · 2714 阅读 · 0 评论 -
Socket发送缓冲区接收缓冲区快问快答
首先,我们要明确一下,通过socket发送数据之后(调用发送方法),数据并不是会直接发送到接收方。整个过程简略图如下:最终数据发送是要通过网卡的,但是socket没法直接将数据发送到网卡,所以只能先将数据发送到操作系统数据发送缓冲区。然后网卡从数据发送缓冲区中获取数据,再发送到接收方。socket接收数据,也不是直接从对端获取的。整个过程简略图如下:首先接收方机器网卡接收到发送方的数据后,先将数据保存到操作系统接收缓冲区。...原创 2022-08-08 20:48:21 · 5344 阅读 · 0 评论 -
TCP滑动窗口模拟实战
客户端与服务端之间的通信是一个数据传输的过程,消息以数据包形式进行传输。在传输的过程中,通过滑动窗口机制来同时传输多个数据包;发送端根据接收端的处理能力,适当控制发送窗口大小,实现流量控制。在数据包较大的情况下,需要将大的数据包拆分成多个小的数据包进行传输。接收端确认接收到一个数据包之后,发送端才能发送下一个数据包。整个过程如下图所示:很明显,这种方式方式的数据传输效率非常低,发送端只有等到接收端确认收到之后才能发送下一个数据包。为了改进这种情况,引入了窗口的概念。窗口大小是指:不需要等待确认包而可以继续发原创 2022-06-18 09:04:39 · 1236 阅读 · 0 评论 -
TCP协议之TIME_WAIT状态实战与分析
TCP/IP协议的三次握手和四次挥手,我们应该都滚瓜烂熟了。下面是一张代表发送接收双方全状态的图本文我们重点关注下TIME_WAIT状态。从图中我们可以看出来,该状态属于主动发起关闭的一方,在收到对方的关闭请求时,所处于的状态。按照TCP/IP协议规定:当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT并持续两倍于最大生存期的时间,这样就能够让TCP重新发送最终的ACK以避免出现丢失的情况。Q:出现丢失?A:怎么理解出现丢失,我们看以下这种场景:当上图中的Server(在Clien原创 2022-06-12 21:48:19 · 1500 阅读 · 0 评论 -
TCP协议基于计时器的重传策略模拟实战
关于TCP协议的重传策略,是TCP数据传输正确性的重要保证。由于下层网络层协议可能出现的包丢失、重复、失序包等问题,当TCP协议基于某种策略确认当前包已经发生以上情况,就会启动重传。TCP拥有两套机制来完成重传:基于超时时间;基于确认消息(SACK);本文主要来模拟下基于超时时间的重传。笔者准备两台机器,一台启动ServerSocket服务,另一台就启动telnet命令进行连接发送请求等操作笔者这里使用的是标准的java ServerSocket,来启动一个端口监听,代码如下: 代码很简单,笔者不再多原创 2022-06-03 21:01:36 · 432 阅读 · 0 评论 -
TCP重置报文段的几种场景
TCP的重置报文段,就是TCP发送了RST包到对端。RST标志位在什么地方呢?我们通过TCP协议头部来看下(图片来自: TCP头部详解_却道天凉_好个秋的博客-CSDN博客_tcp头部)很明显,RST与我们熟悉的SYN、ACK和FIN标志位同属一个级别。但是日常工作中,我们对RST的使用不是很熟悉,本文就来介绍下哪些会产生RST的场景。这个场景很容易理解,如果我们telnet一个并不存在的端口,那么会被快速响应一个RST复位报文段常规的中止连接的方式都是发送FIN标志位,这被称为有序释放。(因为FIN是在所原创 2022-06-03 20:57:38 · 1226 阅读 · 0 评论 -
TCP backlog解析与实战
前言:针对TCP连接三次握手,我们都已经非常熟悉了。那么三次握手之后是不是就一定会被服务端处理请求了呢?可能我们不太清楚操作系统的具体做法,但是凭感觉我们会有两方面的思考:1)如果大量的客户端连接发送SYN请求,服务器根本无力处置这么多SYN请求,那么怎么做限流操作来避免自己被冲垮呢?2)三次握手成功之后,服务端处理程序一直在忙于之前的连接的业务处理,长时间没有感知到新的连接到了,那么对于这个客户端发来的请求应该怎么操作呢?本文就通过对TCP backlog来回答下上述两个问题。原创 2022-05-28 10:14:19 · 2562 阅读 · 0 评论 -
TCP协议解析与实战
前言:之前我们介绍过IP协议和ICMP协议,这两个协议在OSI模型中都位于网络层,主要负责数据包的传递。但是IP协议只负责传输,如果在包传输过程中出现分片乱序、包丢失等问题,IP协议是不负责解决的。所以针对这种异常情况的解决,就需要更上层协议来解决了,这个就是我们本次介绍的TCP协议。1.TCP协议概述1.1 什么是TCP协议?TCP(Transmission Control Protocol)传输控制协议。该协议是一种面向连接的、可靠的、基于IP的传输层协议。1)传原创 2022-05-22 12:36:00 · 2084 阅读 · 1 评论 -
ICMP协议解析与实战
1.ICMP协议概述1.1 什么是ICMP?ICMP(Internet Control Message Protocol的缩写),中文就是:网际报文控制协议。该协议是网络协议族的核心协议之一。通过一张图来看下该协议所处位置:(图片来自百度安全验证):可以看到,ICMP协议与IP协议同属网络层。虽然两者同属网络层,没有上下级关系,但是ICMP协议最终还是要依靠IP协议将报文发送出去。1.2 ICMP协议作用IP协议我们知道是发送数据包的重要协议,实现了数据包的分片发送.原创 2022-05-21 11:02:05 · 4780 阅读 · 1 评论 -
IP协议解析与实战
1.IP协议概述1.1 什么是IP协议?IP(Internet Protocol缩写)中文就是网际协议,这个比较抽象,我们比较熟悉的还是ip地址。ip地址翻译成中文就是网际协议地址。这个地址与我们之前说过的MAC地址有什么关系呢?既然物理机器已经有了MAC地址,那么还需要IP地址做什么呢?1.2 IP地址作用通过之前对ARP协议的分析,可以发现它是通过MAC地址发送数据的,但是其有一个很大的问题:ARP协议是子网广播协议(在子网中的所有的设备都会收到该ARP协议数据包)。原创 2022-05-15 16:39:45 · 2608 阅读 · 1 评论 -
ARP协议解析与实战
1.ARP协议概述1.1 什么是ARP协议?ARP是Address Resolution Protocol的简写。翻译成中文就是:地址解析协议。那么解析什么地址呢?本质上就是把IP解析成MAC的一种协议。1.2 为什么需要把IP解析成MAC地址?看了ARP协议的内容,难免我们会有一个疑问,就是当前主题。我们知道根据OSI模型,把网络工作分为七层,如下图所示(图片来自:计算机网络-数据结构-MAC帧头-IP头-TCP头-UDP头 - 多情剑客无情剑; - 博客园 ):以..原创 2022-05-14 19:02:07 · 1039 阅读 · 0 评论 -
log4j2异步日志的使用
前言:之前三篇文章我们介绍过log4j、logback以及log4j2的springboot使用方式。那么在实际的工作中,我们应该使用哪种日志框架呢?做选择之前,我们肯定要有所比对,究竟哪种日志框架性能最好,使用最方便?从下图中(来自log4j2官网测试)可以看出,log4j2(有三种模式[全异步、混合异步、同步])的性能吊打log4j1和logback。尤其在多线程的测试下,log4j2的性能更是火力全开。所以,为了实现更好的日志打印,我们就选择log4j2即可。.原创 2022-05-12 22:01:09 · 3595 阅读 · 0 评论 -
log4j2使用实战
前言:今天完成最后一篇文章的介绍,也就是我们的log4j2。log4j2的优点笔者就不再介绍了,网上一大堆相关文章。简单粗暴点,我们直接上使用。1.log4j2单独使用实战1.1 引入maven依赖 <!-- log4j2 依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <原创 2022-05-08 21:14:07 · 635 阅读 · 1 评论 -
logback使用实战
前言:上文我们介绍了log4j的三种使用情况。本文依旧按照这种方式来介绍下logback的使用。只不过logback与log4j是有所不同的,logback-classic包本身就引入了slf4j相关包(slf4j-api),而logback-classic包里也包含了slf4j-logback的相关对接实现。所以使用logback-classic包就相当于使用了slf4j1.logback单独使用1.1 引入maven依赖 <dependency>原创 2022-05-08 21:10:13 · 798 阅读 · 0 评论 -
log4j使用实战
前言:每次排查log相关的问题总会被逼疯,log4j、logback、log4j2这几个之间的关系,尤其再加上slf4j,那酸爽,经历过的人都懂。所以才促成了笔者这一个系列的博客:log4j实战、logback实战、log4j2实战。我们从三个方法来实战每一种log类型:log单独使用、log与slf4j的组合、springboot与log的组合。当然,笔者这个系列的文章,并不是科普类文章,有关于log.xml如何配置这些知识点网络上已经有很多文章了,不再赘述。希望整理完这个系列之后原创 2022-05-06 22:40:01 · 551 阅读 · 0 评论 -
Linux tcpdump命令实战
前言:网络这块知识点一直都是笔者的薄弱之处。虽然也一直在学习理论知识,但是总觉得学完就忘,一直在重复学习。究其原因,应该还是理论没有与实践结合在一起。而想学习具象的网络知识,那么工具就是必不可少的。目前的工具有两类:wireshark(可视化工具)、tcpdump(命令)。本文我们就来学习下tcpdump命令的使用1.tcpdump作用tcpdump是一款强大的网络抓包工具。通过tcpdump命令的使用可以帮助我们分析、调试网络数据2.tcpdump语法同样我们通过man原创 2022-05-02 15:35:52 · 1014 阅读 · 0 评论 -
Linux netstat命令实战
前言:netstat是我们常用的一款用于统计网络套接字连接情况的工具。TCP、UDP、监听状态的套接字等都可以监听到。在排查网络相关问题时,会经常用到这款工具,下面我们就一起来看下那些比较实用的使用方式。1.netstat实用参数最全的话肯定还是通过man netstat命令输出root@93de58bae514:/proc/net# man netstatNETSTAT(8)原创 2022-05-02 15:31:56 · 1050 阅读 · 0 评论 -
TCP连接超时模拟实战
前言:发送TCP请求连接远端服务器,在规定时间内没有返回ACK响应,这种情况一般我们称之为三次握手超时。三次握手连接超时的原因主要有两种:1)client发送SYN后,进入SYN_SENT状态,等待server的SYN+ACK超时;2)server收到client发送的SYN后,返回SYN+ACK,进入SYN_RECV状态,等待client的ack超时;当超时发生时,就会重传,一直到某一个阈值,还没有收到回应,则会放弃,终止本次连接的创建。本文我们就来模拟下第一种超时现象。原创 2022-05-31 23:38:11 · 2410 阅读 · 2 评论 -
系统网络性能评估实战
前言:说到性能评估,首先我们有两个方面需要确认:* 我们要确认哪些性能点需要评估,有个具体的参数* 使用哪些压测工具来进行评估网络性能评估参数,就是笔者上一篇文章 机器网络配置与性能指标监控实战 中介绍的那些性能指标点:带宽、吞吐量、延迟、PPS等至于压测工具的话,下面我们逐个来介绍下1.应用层性能测试按照7层网络协议模型,应用层应该是我们在实际工作中最常用的一层。我们按照最常用的HTTP协议来测试,市面上的压测工具一般有ab(Apache自带的HTTP压测工具)、w原创 2022-04-30 18:06:39 · 501 阅读 · 0 评论 -
机器网络配置与性能指标监控实战
前言:有关于网络问题,又是笔者另一个薄弱知识点。应该说是理论知识不够扎实,每次理论学的差不多的时候,由于缺乏实战,一段时间之后,又忘记的差不多了。每次重复这种情况还是蛮尴尬的,所以理论结合实战才是学习网络知识的最佳途径。本文主要介绍如何通过命令来了解当前机器的网络配置,而对于网络方面的监控,究竟有哪些指标可供使用。1.机器网络配置所谓网络配置,实际最简单的就是当前机器的IP地址,当然还有别的重要信息。我们通过ifconfig命令可以了解到root@93de58bae原创 2022-04-30 11:35:40 · 529 阅读 · 0 评论 -
Linux strace命令的用法
前言:Linux的strace命令简直就是一个调试神器。但是对于笔者而言却很陌生,一方面确实在实际生产中没有用到过这个命令,另一方面对操作系统方法不够熟悉,即使打印出了相关结果,也无法进行有效分析。本文笔者是先学习了别人的关于strace命令的文章后,再来总结。1.strace简介在Linux系统中,strace命令是一个集诊断、调试、统计为一体的工具。strace常用来跟踪进程执行时的系统调用和所接收的信号。比如当进程进行磁盘读写时,会由用户态切换到内核态,而此时通过strac原创 2022-04-23 19:02:36 · 4965 阅读 · 0 评论 -
Linux sar命令实战
前言:Linux中的sar命令,全称是(System Activity Reporter系统活动情况报告),它是Linux下的系统运行状态监控工具,可以从多个方面对系统活动进行报告。包括:网络收发包情况、文件读写情况、磁盘I/O、内存使用情况等。堪称全能小王子,下面我们一起来看下sar命令的使用。1.sar命令安装笔者使用的是Ubuntu机器,安装比较简单root@91230cc467cc:/usr/local/tomcat# apt-get install sar在使用s原创 2022-04-23 16:14:39 · 2084 阅读 · 0 评论 -
文件系统读写性能测试实战
前言:笔者本来准备直接测试磁盘块的读写性能(随机读写、顺序读写),但是奈何环境一直搭建不好,所以只能退而求其次,测试下文件系统的读写性能(随机读写、顺序读写)。有关于两者的区别,可以参考下笔者另一篇博客:磁盘性能指标监控实战1.环境准备笔者安装了docker Ubuntu:18.04版本,所有的命令就在该容器中测试 ;命令安装(fio命令)apt-get install -y fio2.fio命令fio工具是主流的第三方I/O测试工具,它提供了大量的可定制化选项,可以用原创 2022-04-23 11:50:08 · 1665 阅读 · 0 评论 -
磁盘性能指标监控实战
前言:磁盘I/O这块也属于笔者比较薄弱的知识点。平时工作中基本没有很好的认知,也没有很好的检测工具来确认磁盘IO问题。照猫画虎的从网络上找了很多文章,还是比较希望能够转化为自己的知识点。1.基础知识先上图(图片来自极客时间 <<Linux性能优化实战>>):我们从上到下的来分析整个层次,从应用程序发起调用到本地磁盘,基本经历了以下几个层次:1.1 应用程序调用库函数就java程序而言,我们一般通过// 获取指定路径的文件引用File f =原创 2022-04-03 12:33:33 · 1566 阅读 · 0 评论 -
Linux iostate命令实战
前言:iostat(I/O statistics)工具,对系统的磁盘操作活动进行监控。类似于vmstat,它只能对系统整体情况进行分析,无法对特定进程进行分析。1.iostat基本输出iostat命令默认输出结果如下:root@7bc18553126f:/tmp# iostatLinux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)avg-cpu: %user %nice %system %io原创 2022-04-03 12:30:35 · 2672 阅读 · 1 评论 -
Linux pidstat命令实战
前言:前文中我们了解了vmstat命令,其可以监控操作系统整体的CPU、内存、IO运行情况。但是如果我们相对某一个进程进行监控的话,vmstat就难免心有余而力不足。这时就需要本文主角登场,pidstat命令。pidstat可用于监控全部或指定进程的CPU、内存、IO等系统资源的占用情况。下面就一起来实战下该命令吧。1.常规使用最常用的pidstat命令就是 pidstat 5(5秒刷新一次,用户也可自定义为其他时间段)root@7bc18553126f:/# pidstat原创 2022-04-03 12:27:45 · 1867 阅读 · 0 评论 -
Linux mpstat命令实战
前言:mpstat是一款实时系统监控工具。它主要展示与CPU相关的统计信息。在多CPU系统中,它能查看ALL(所有CPU的平均状况),也能查看特定CPU的信息。1.常规使用类似于vmstat和pidstat,mpstat直接的命令输出的是从系统启动以来的平均值root@7bc18553126f:/# mpstat Linux 5.10.76-linuxkit (7bc18553126f) 03/15/22 _aarch64_ (4 CPU)14:20:18 CPU原创 2022-04-03 12:24:25 · 1020 阅读 · 0 评论 -
Linux free命令中的Buffer和Cache
前言:查看当前系统的内存使用情况时,我们最常使用free来查看,如下root@7bc18553126f:/# free -h total used free shared buff/cache availableMem: 1.9G 374M 465M 258M 1.1G 1.3GSwap: 1.0G原创 2022-03-30 21:41:23 · 4988 阅读 · 0 评论 -
磁盘IO问题排查实战
前言:有关于磁盘IO过高导致CPU iowait比较高的问题,笔者一直没有在产线遇到过。所以想去通过写代码来模拟这个操作,但是无奈笔者的Mac机器性能太强了,所以一直压不出来想要的效果。既然有些效果没法出来,我们就先方法论一下,先用工具了解当前服务及进程的状态,然后逐个分析。准备工作:1.代码准备,(笔者会在最后贴出,模拟写磁盘动作),最终打成war包,在docker tomcat中启动2.工具准备,需要的验证工具,iostat、strace、lsof、pidstat,需要提前安原创 2022-03-30 21:33:16 · 3459 阅读 · 0 评论 -
Linux vmstat命令实战
前言:vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析(后续会介绍pidstat命令来展示各个进程的资源使用情况)1.常规使用在使用vmstat命令时,最常用的就是vmstat -w 5这里的5意思是每5秒输出一次root@7bc18553126f:/# vmstat -w 5procs -------------------原创 2022-03-28 21:37:50 · 747 阅读 · 0 评论 -
cpu上下文切换对性能的影响(实战)
前言:在之前CPU负载的几种情况相关文章中,我们描述了几种情况导致CPU负载高。最神奇的就是当多个活跃进程(多于CPU个数)在执行操作时,通过vmstat命令可以看到对应的cs(context switch)很高,并同时引起了CPU的高负载。那么为什么CPU上下文切换会引起高负载均衡呢?我们一起来学习下1.什么是CPU上下文切换?我们知道,现代CPU基本都是基于多核、基于抢占式。CPU会给每个任务一定的时间分片来执行任务,当A进程时间分片使用完成之后,就会切换到下一个B进程来执行原创 2022-03-28 21:33:57 · 1270 阅读 · 0 评论 -
JDK8 GC日志分析
前言:从事java开发的小伙伴,对JVM都不会陌生。这块的知识点笔者不再多述,网络上有很多教程。如果想去系统性的学习,笔者还是推荐 周志明老师的 《深入理解Java虚拟机》基本了解了JVM的内存结构后,那么平时我们怎么排查jvm相关的问题呢?那就要从jvm参数和GC日志来分析具体问题了,通过jvm参数了解其基本设置;通过GC日志了解GC具体情况。下面我们来实战一把。1.准备工作笔者使用的JDK版本为1.8.0_131版本,通过命令java -version可以看出P原创 2022-03-26 13:17:03 · 1672 阅读 · 0 评论 -
du与df命令实战
前言:查看当前磁盘使用情况、查找占用空间最大的文件文件夹是日常工作中常用的操作。一般情况下通过df、du命令来完成,本文就来详细了解下这两个命令。1.df命令一般情况下,我们不太了解该命令时直接先man一下,查看基本用法root@7bc18553126f:/# man dfNAME df - report file system disk space usageSYNOPSIS df [OPTION]... [FILE]...DESCRIPTION原创 2022-03-26 10:53:16 · 1968 阅读 · 0 评论 -
jhat命令分析java heapdump信息实战
前言:很多时候,我们需要分析下当前进程的内存使用情况(OOM等异常)。一般,我们会先使用命令打印出一个heap dump文件(文件会比较大),然后使用命令或工具来分析占用内存比较大的对象。命令的话就是使用本文中要介绍的jhat命令,而关于工具一般使用MAT工具(下一篇文章中介绍)。本次使用jhat工具主要完成三个小目标:* 占用内存最大对象分析* 对象具体内容分析* OQL语句使用1.准备工作1.1 基本对象public class Student impl原创 2022-03-23 21:23:05 · 3818 阅读 · 1 评论 -
JDK常用命令实战
前言:作为一名专业的java开发工程师,每每都会遇到JVM相关的问题,多在于full GC过多、超时,内存参数设置异常,或者查看异常的线程信息。这些问题,本质上并不复杂,只要我们选择合适的工具就很简单。那么有哪些工具呢?JDK自身就提供了很多可靠的工具。本文就来看下JDK提供的那些实用命令工具。注意:笔者使用的是Windows机器,JDK安装位置为D:\Program Files\Java\jdk1.8.0_131这些命令所在位置就是%JDK_HOME%\bin目录下1.ji原创 2022-03-21 18:28:46 · 1541 阅读 · 0 评论 -
cpu使用率飚高实战分析(java应用)
前言:有关于java应用CPU使用率超高的问题,已经有很多博客有过分析了。无外乎就是,某个线程执行执行耗CPU的动作了。我们主要的工作就是通过Linux命令和java相关命令找到具体的线程,并分析线程执行代码。本文比较简单,就当是做一个记录。1.准备工作1.1 安装并启动docker tomcat# 1.拉取tomcat镜像hxw@hxwdeMacBook-Pro ~ % docker pull tomcat# 2.完成后,启动一个tomcat容器# tomca原创 2022-03-21 10:24:45 · 1599 阅读 · 0 评论 -
cpu平均负载高的几种情况
前言:每次排查性能相关问题的时候,我们都会先通过监控来查看下当前机器的CPU负载,根据负载结果值的输出,来判断当前CPU的基本状况。那么什么是CPU负载呢?具体CPU负载多少才算是正常的呢?有哪些情况会导致CPU负载高呢?今天我们就来统一说明下。注意:笔者使用ubuntu:18.04版本镜像创建docker 容器,如果没有相关命令,则需要提前装载好1.CPU负载的查看通过top命令或者uptime命令可以查看到1.1 top命令root@7bc18553126f:/原创 2022-03-20 10:58:07 · 2829 阅读 · 0 评论 -
top命令实战(转载)
Linux中top命令参数详解top命令用法top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。top的使用方式 top [-d number] | top [-bnp]参数解释:-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 -b:以批次的方式执行top。 -n:与-b配合使用,表示需要进行几次top命令的输出结果。 -p:指定特定的pid进程号进行观察。在top命令显示的页面还可以输入以下按转载 2022-03-13 21:28:11 · 836 阅读 · 0 评论