所以,笔者就去Linux源码里面,一探究竟。 首先介绍下Linux环境 TIME_WAIT这个参数通常和五元组重用扯上关系。在这里,笔者先给出机器的内核参数设置,以免和其它问题相混淆。...具体问题可以看笔者的以往博客。...但图中并没有指出2MSL到底是多长时间,但笔者从Linux源码里面翻到了下面这个宏定义。...Linux内核是通过时间轮来处理到期的TIME_WAIT socket,如下图所示: 内核将60s的时间分为8个slot(INET_TWDR_RECYCLE_SLOTS),每个slot处理7.5(...才跳转到下一个slot twdr->slot = ((twdr->slot + 1) & (INET_TWDR_TWKILL_SLOTS - 1)); } // 如果还需要继续处理,则在7.5s后再运行此函数
简单的epoll例子 下面的例子,是从笔者本人用c语言写的dbproxy中的一段代码。由于细节过多,所以做了一些删减。...那么,由accept获得的client_fd的结构如下图所示: (注:由于是tcp socket,所以这边sock->ops=inet_stream_ops,这个初始化的过程在我的另一篇博客>中,博客地址如下: https://my.oschina.net/alchemystar/blog/1791017) 既然知道了tfile->f_op->poll的实现...,等待内核重新调度进程,然后epoll_wait对应的这个进程重新运行后,就从schedule恢复,继续下面的ep_send_events(向用户空间拷贝事件并返回)。...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐_。
从linux源码看epoll 前言 在linux的高性能网络编程中,绕不开的就是epoll。...简单的epoll例子 下面的例子,是从笔者本人用c语言写的dbproxy中的一段代码。由于细节过多,所以做了一些删减。...(注:由于是tcp socket,所以这边sock->ops=inet_stream_ops,这个初始化的过程在我的另一篇博客>中,博客地址如下: https...,等待内核重新调度进程,然后epoll_wait对应的这个进程重新运行后,就从schedule恢复,继续下面的ep_send_events(向用户空间拷贝事件并返回)。...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐^_^。
img 图中的几个参数: tickMs: 时间跨度 wheelSize: 时间轮中 bucket 的个数 startMs: 开始时间 interval:时间轮的整体时间跨度 = tickMs * wheelSize...秒针走的一圈、分针走的一圈和时针走的一圈就形成了一个多层时间轮的关系。 img 第N层时间轮走了一圈,等于 N+1 层时间轮走一格。即高一层时间轮的时间跨度等于当前时间轮的整体跨度。...随着时间推进,也会有一个时间轮降级的操作,原本延时较长的任务会从高一层时间轮重新提交到时间轮中,然后会被放在合适的低层次的时间轮当中等待处理; 在 Kafka 中时间轮之间如何关联呢,如何展现这种高一层的时间轮关系...其实很简单就是一个内部对象的指针,指向自己高一层的时间轮对象。 另外还有一个问题,如何推进时间轮的前进,让时间轮的时间往前走。...外部通过一个线程(叫做ExpiredOperationReaper)从 DelayQueue 中获取超时的任务列表 TimerTaskList,然后根据 TimerTaskList 的 过期时间来精确推进时间轮的时间
图中的几个参数: tickMs: 时间跨度 wheelSize: 时间轮中 bucket 的个数 startMs: 开始时间 interval:时间轮的整体时间跨度 = tickMs * wheelSize...秒针走的一圈、分针走的一圈和时针走的一圈就形成了一个多层时间轮的关系。 第N层时间轮走了一圈,等于 N+1 层时间轮走一格。即高一层时间轮的时间跨度等于当前时间轮的整体跨度。...随着时间推进,也会有一个时间轮降级的操作,原本延时较长的任务会从高一层时间轮重新提交到时间轮中,然后会被放在合适的低层次的时间轮当中等待处理; 在 Kafka 中时间轮之间如何关联呢,如何展现这种高一层的时间轮关系...另外还有一个问题,如何推进时间轮的前进,让时间轮的时间往前走 Netty 中的时间轮是通过工作线程按照固定的时间间隔 tickDuration 推进的 如果长时间没有到期任务,这种方案会带来空推进的问题...外部通过一个线程(叫做ExpiredOperationReaper)从 DelayQueue 中获取超时的任务列表 TimerTaskList,然后根据 TimerTaskList 的 过期时间来精确推进时间轮的时间
从linux源码看socket的close 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...而inet_timewait_sock被挂入一个bucket中,由 inet_twdr_twcal_tick定时从bucket中将超过(2MSL或者基于RTO计算的时间)的time_wait的实例删除。...如果应用close的时间过晚,对端已经将连接给销毁。则应用发送给fin给对端,对端会由于找不到对应的连接而发送一个RST(Reset)报文。...但最终解决方案还是得从应用程序着手。...直到现在自己带着问题独立看linux源码的时候,尽管有之前的基础,仍旧被其中的各种细节所迷惑。希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。
本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...timeout = ((2 << boundary) - 1) * rto_base; ...... } ========================>linux 内核版本2.6.32.630时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: 由于没有java并没有设置so_sndtimeo的选项,所以在...java的SocketInputStream的sockRead0超时时间 java的超时时间由SO_TIMOUT决定,而linux的socket并没有这个选项。
理解accept的关键点是,它会创建一个新的Socket,这个新的Socket来与对端运行connect()的对等Socket进行连接,如下图所示: 接下来,我们就进入Linux内核源码栈吧 accept...关于epoll的原理可以看下笔者之前的博客《从linux源码看epoll》: https://www.cnblogs.com/alchemystar/p/13161781.html 在这里描述一下原因,...在accept_queue被填充后,由用户线程通过accept系统调用从队列中获取对应的fd 值得注意的是,当用户线程来不及处理的时候,内核会drop掉三次握手成功的连接,导致一些诡异的现象,具体可以看笔者的另一篇博客...: https://www.cnblogs.com/alchemystar/p/13473999.html 另外,对于accept_queue具体的填充机制以及源码,可以见笔者另一篇博客的详细分析 《从Linux...源码看Socket(TCP)的listen及连接队列》: https://www.cnblogs.com/alchemystar/p/13845081.html 总结 Linux内核源码博大精深,每次扎进去探索时候都会废寝忘食
既然 MySQL 是运行在操作系统之上的,那我们观测操作系统的内核事件,应该也能发现性能问题。 说干就干,下面是我最近新入手的云主机上的优化效果对比。...profile # 这个就可以采集堆栈信息用来画火焰图 ---- 其次我们还要知道特定环节占用时间长的原因,对不同资源的观察命令都不一样,这个类工具的量就比较大了。...,其在 x 轴方向上的长度代表抽样时被抽到的比例(也可以看成时间上的占比);也就是说那些比较长的方块通常是性能问题的元凶,找到并解决掉他们性能就会好起来。...看总量 mpstat 1 20 Linux 5.14.0-55.el9.x86_64 (git-sqlpy-com) 07/21/2022 _x86_64_ (2 CPU) 01:16:46...到这里就非常明确是哪里慢了。 ---- 针对性优化 由于我们已经知道是写 redo-log 和 binlog 日志慢了,所以我们可以针对性的做参数优化了。
前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...今天笔者就来从Linux源码的角度看下Server端的Socket在进行bind的时候到底做了哪些事情(基于Linux 3.10内核)。...返回,若成功则为0,若出错则为-1 int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); 好了,我们直接进入Linux...SO_REUSEPORT SO_REUSEPORT是Linux在3.9版本引入的新功能。...鉴于此,Linux增加了SO_REUSEPORT,而之前bind中判断是否冲突的下面代码也是为这个参数而添加的逻辑: if(!reuseport || !
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。...本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。...timeout = ((2 << boundary) - 1) * rto_base; ...... } ========================>linux 内核版本2.6.32.630时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: ?...java的SocketInputStream的sockRead0超时时间 java的超时时间由SO_TIMOUT决定,而linux的socket并没有这个选项。
PostgreSQL 查看内存使用的方法比较多, 大部分都是进入到POSTGRESQL 中进行查看的,今天从PostgreSQL 外部来查看内存的使用方式和方法....本次主要使用的命令就是ps命令 通过ps 命令中的附带参数, 对当前的PG运行的线程进行一个展示,其中每个线程使用的CPU的Memory 的比率也会清晰的展示在屏幕中....在LINUX 中proc目录中有所有相关的进程的信息, PSS 通过下面的预计获得,所以RSS - PSS 等于的就是进程独享的内存 ps -u postgres o pid= | sed 's#.
Linux下查看网卡驱动和版本信息 查看网卡生产厂商和信号 查看基本信息:lspci 查看详细信息:lspci -vvv # 3个小写的v 查看网卡信息:lspci | grep Ethernet
下面的脚本可以获取一段程序的运行时间: #!...其中: date +%s获取当前的纪元时(Unix时间),即自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。 sleep 5使程序延时5秒钟。...yy %D 06/02/19 年 %y 19 年 %Y 2019 小时(12小时) %I 05 小时(24小时) %H 17 分钟 %M 44 秒 %S 04 纳秒 %N 747856472 Unix时间
Linux入门002 | 看日期、时间换算和定时作业 前言 在Linux世界里,日期与时间不仅是系统运行的脉络,更是众多命令行操作的核心要素。...无论是追踪日志、管理备份,还是安排定时任务,对日期和时间的精准操控都是提升工作效率的关键。本期文章将揭示Linux指令中与日期相关的实用技巧和魔法般的组合,助您轻松驾驭时间,让命令行工作如虎添翼。...一、获取当前日期与时间 最基础也最常用的日期时间命令是 date。简单执行 date 即可显示当前系统时间: In [31]: !...以下是一些常见操作: 查找最近修改的文件:使用 find 命令结合 -mtime、-ctime 或 -atime 选项,按修改时间、状态改变时间或访问时间筛选文件。...reference_file /home/mw/project/1.txt /home/mw/project/2.txt /home/mw/project/3.txt 四、调度基于日期的任务 计划任务是Linux
Apache为了能够获得最好的运行性能,针对不同的平台 (Unix/Linux、Window)做了优化,为不同的平台提供了不同的MPM,用户可以根据实际情况进行选择,其中最常使用的MPM有 prefork...Nginx的模块从功能上分为如下三类: Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。...FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后将结果返回给HTTP服务器。...FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。 接下来以Nginx下PHP的运行过程来说明。...FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
Apache为了能够获得最好的运行性能,针对不同的平台 (Unix/Linux、Window)做了优化,为不同的平台提供了不同的MPM,用户可以根据实际情况进行选择,其中最常使用的MPM有 prefork...这个生命周期是在perfork工作下的示意,从图中可以看出,Apache对于每一个请求都要启动一个单独的进程来处理。...Nginx的模块从功能上分为如下三类: Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。...FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。 接下来以Nginx下PHP的运行过程来说明。...FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
前言:昨天有个同学碰到发送udp包时收到destination unreachable的icmp包问题,本文简单介绍一下linux5.9中icmp包的处理流程。...我们从收到一个udp包开始分析,具体函数是udp_rcv。...收到icmp包的处理流程 我们从收到ip包开始分析。...我们再来看看哪里会调用这个函数。...后记:本文简单介绍了icmp的产生和处理过程,后面有时间再细化一下。
再也不怕过时了,当然,现在内核的代码量级非常大,不可能看得完也不可能都看,只是选取自己感兴趣的一些点看一下。...今天分析的内容是从socket函数开始,看看linux网络层的设计。下面我们看一下我们平时写网络编程代码时的用法。...网络层的初始化 从socket函数的定义中我们看到有family和type两个参数,这两个属性都会对应不同的实现。我们先看看family的实现。...rcu_assign_pointer(net_families[ops->family], ops); spin_unlock(&net_family_lock); return err;} 那么哪里会调用...但是总的来说,网络层的实现是非常复杂的,尤其到了新版的内核,本文做了个大致的介绍,后续有时间继续深入分析。
引言 作为 cron 作业调度程序的替代方案,at 命令允许您安排命令在给定时间运行一次,而无需编辑配置文件。...enable atd --------- On SysVinit --------- # service atd start # chkconfig --level 35 atd on atd 运行后...另外请注意,at 不仅允许以下固定时间:现在、中午(12:00)和午夜(00:00),还允许自定义 2 位数字(代表小时)和 4 位数字时间(小时和分钟)。...例如,要在今天晚上 11 点(如果当前日期晚于晚上 11 点,则明天)运行 updateb,请执行以下操作: # echo "updatedb" | at -m 23 要在今天 23:55 关闭系统(...时间规范遵循 POSIX 标准。 总结 根据经验,只要您只想在明确定义的时间运行命令或执行给定任务一次,请使用 at 代替 cron 作业调度程序。对于其他场景,请使用 cron。
领取专属 10元无门槛券
手把手带您无忧上云