linux内核分析网络
❶ 关于 linux 网络,你必须知道这些
我们一起学习了文件系统和磁盘 I/O 的工作原理,以及相应的性能分析和优化方法。接下来,我们将进入下一个重要模块—— Linux 的网络子系统。
由于网络处理的流程最复杂,跟我们前面讲到的进程调度、中断处理、内存管理以及 I/O 等都密不可分,所以,我把网络模块作为最后一个资源模块来讲解。
同 CPU、内存以及 I/O 一样,网络也是 Linux 系统最核心的功能。网络是一种把不同计算机或网络设备连接到一起的技术,它本质上是一种进程间通信方式,特别是跨系统的进程间通信,必须要通过网络才能进行。随着高并发、分布式、云计算、微服务等技术的普及,网络的性能也变得越来越重要。
说到网络,我想你肯定经常提起七层负载均衡、四层负载均衡,或者三层设备、二层设备等等。那么,这里说的二层、三层、四层、七层又都是什么意思呢?
实际上,这些层都来自国际标准化组织制定的开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。
但是 OSI 模型还是太复杂了,也没能提供一个可实现的方法。所以,在 Linux 中,我们实际上使用的是另一个更实用的四层模型,即 TCP/IP 网络模型。
TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层,其中,
为了帮你更形象理解 TCP/IP 与 OSI 模型的关系,我画了一张图,如下所示:
当然了,虽说 Linux 实际按照 TCP/IP 模型,实现了网络协议栈,但在平时的学习交流中,我们习惯上还是用 OSI 七层模型来描述。比如,说到七层和四层负载均衡,对应的分别是 OSI 模型中的应用层和传输层(而它们对应到 TCP/IP 模型中,实际上是四层和三层)。
OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。
OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。
OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
有了 TCP/IP 模型后,在进行网络传输时,数据包就会按照协议栈,对上一层发来的数据进行逐层处理;然后封装上该层的协议头,再发送给下一层。
当然,网络包在每一层的处理逻辑,都取决于各层采用的网络协议。比如在应用层,一个提供 REST API 的应用,可以使用 HTTP 协议,把它需要传输的 JSON 数据封装到 HTTP 协议中,然后向下传递给 TCP 层。
而封装做的事情就很简单了,只是在原来的负载前后,增加固定格式的元数据,原始的负载数据并不会被修改。
比如,以通过 TCP 协议通信的网络包为例,通过下面这张图,我们可以看到,应用程序数据在每个层的封装格式。
这些新增的头部和尾部,增加了网络包的大小,但我们都知道,物理链路中并不能传输任意大小的数据包。网络接口配置的最大传输单元(MTU),就规定了最大的 IP 包大小。在我们最常用的以太网中,MTU 默认值是 1500(这也是 Linux 的默认值)。
一旦网络包超过 MTU 的大小,就会在网络层分片,以保证分片后的 IP 包不大于 MTU 值。显然,MTU 越大,需要的分包也就越少,自然,网络吞吐能力就越好。
理解了 TCP/IP 网络模型和网络包的封装原理后,你很容易能想到,Linux 内核中的网络栈,其实也类似于 TCP/IP 的四层结构。如下图所示,就是 Linux 通用 IP 网络栈的示意图:
我们从上到下来看这个网络栈,你可以发现,
这里我简单说一下网卡。网卡是发送和接收网络包的基本设备。在系统启动过程中,网卡通过内核中的网卡驱动程序注册到系统中。而在网络收发过程中,内核通过中断跟网卡进行交互。
再结合前面提到的 Linux 网络栈,可以看出,网络包的处理非常复杂。所以,网卡硬中断只处理最核心的网卡数据读取或发送,而协议栈中的大部分逻辑,都会放到软中断中处理。
我们先来看网络包的接收流程。
当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。
接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。
接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。比如,
最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。
为了更清晰表示这个流程,我画了一张图,这张图的左半部分表示接收流程,而图中的粉色箭头则表示网络包的处理路径。
了解网络包的接收流程后,就很容易理解网络包的发送流程。网络包的发送流程就是上图的右半部分,很容易发现,网络包的发送方向,正好跟接收方向相反。
首先,应用程序调用 Socket API(比如 sendmsg)发送网络包。
由于这是一个系统调用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。
接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。比如,传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。
分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。
最后,驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。
多台服务器通过网卡、交换机、路由器等网络设备连接到一起,构成了相互连接的网络。由于网络设备的异构性和网络协议的复杂性,国际标准化组织定义了一个七层的 OSI 网络模型,但是这个模型过于复杂,实际工作中的事实标准,是更为实用的 TCP/IP 模型。
TCP/IP 模型,把网络互联的框架,分为应用层、传输层、网络层、网络接口层等四层,这也是 Linux 网络栈最核心的构成部分。
我结合网络上查阅的资料和文章中的内容,总结了下网卡收发报文的过程,不知道是否正确:
当发送数据包时,与上述相反。链路层将数据包封装完毕后,放入网卡的DMA缓冲区,并调用系统硬中断,通知网卡从缓冲区读取并发送数据。
了解 Linux 网络的基本原理和收发流程后,你肯定迫不及待想知道,如何去观察网络的性能情况。具体而言,哪些指标可以用来衡量 Linux 的网络性能呢?
实际上,我们通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。
除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。
分析网络问题的第一步,通常是查看网络接口的配置和状态。你可以使用 ifconfig 或者 ip 命令,来查看网络的配置。我个人更推荐使用 ip 工具,因为它提供了更丰富的功能和更易用的接口。
以网络接口 eth0 为例,你可以运行下面的两个命令,查看它的配置和状态:
你可以看到,ifconfig 和 ip 命令输出的指标基本相同,只是显示格式略微不同。比如,它们都包括了网络接口的状态标志、MTU 大小、IP、子网、MAC 地址以及网络包收发的统计信息。
第一,网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。
第二,MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。
第三,网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。
第四,网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:
ifconfig 和 ip 只显示了网络接口收发数据包的统计信息,但在实际的性能问题中,网络协议栈中的统计信息,我们也必须关注。你可以用 netstat 或者 ss ,来查看套接字、网络栈、网络接口以及路由表的信息。
我个人更推荐,使用 ss 来查询网络的连接信息,因为它比 netstat 提供了更好的性能(速度更快)。
比如,你可以执行下面的命令,查询套接字信息:
netstat 和 ss 的输出也是类似的,都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。
其中,接收队列(Recv-Q)和发送队列(Send-Q)需要你特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。当然还要注意,在不同套接字状态下,它们的含义不同。
当套接字处于连接状态(Established)时,
当套接字处于监听状态(Listening)时,
所谓全连接,是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要被 accept() 系统调用取走,服务器才可以开始真正处理客户端的请求。
与全连接队列相对应的,还有一个半连接队列。所谓半连接是指还没有完成 TCP 三次握手的连接,连接只进行了一半。服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。
类似的,使用 netstat 或 ss ,也可以查看协议栈的信息:
这些协议栈的统计信息都很直观。ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。
比如,上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。
接下来,我们再来看看,如何查看系统当前的网络吞吐量和 PPS。在这里,我推荐使用我们的老朋友 sar,在前面的 CPU、内存和 I/O 模块中,我们已经多次用到它。
给 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等。执行下面的命令,你就可以得到网络接口统计信息:
这儿输出的指标比较多,我来简单解释下它们的含义。
其中,Bandwidth 可以用 ethtool 来查询,它的单位通常是 Gb/s 或者 Mb/s,不过注意这里小写字母 b ,表示比特而不是字节。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特。如下你可以看到,我的 eth0 网卡就是一个千兆网卡:
其中,Bandwidth 可以用 ethtool 来查询,它的单位通常是 Gb/s 或者 Mb/s,不过注意这里小写字母 b ,表示比特而不是字节。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特。如下你可以看到,我的 eth0 网卡就是一个千兆网卡:
我们通常使用带宽、吞吐量、延时等指标,来衡量网络的性能;相应的,你可以用 ifconfig、netstat、ss、sar、ping 等工具,来查看这些网络的性能指标。
小狗同学问到: 老师,您好 ss —lntp 这个 当session处于listening中 rec-q 确定是 syn的backlog吗?
A: Recv-Q为全连接队列当前使用了多少。 中文资料里这个问题讲得最明白的文章: https://mp.weixin.qq.com/s/yH3PzGEFopbpA-jw4MythQ
看了源码发现,这个地方讲的有问题.关于ss输出中listen状态套接字的Recv-Q表示全连接队列当前使用了多少,也就是全连接队列的当前长度,而Send-Q表示全连接队列的最大长度
❷ 一张图看懂Linux内核运行交互关系,值得收藏!
很多朋友如果接触过Linux的都知道Kernel的含义,kernel是操作系统的核心或者最重要的部分。众所周知的是,几乎整个互联网都运行在 Linux上,从网络协议,到服务器,到你平常访问的绝大多数网站,都能看到它的身影,Linux 内核就是最复杂最流行的开源项目之一。
无意中看到MakeLinux 制作的Linux内核交互图,讲的很全面,这里分享给大家。
俗话说“一图胜千言”,下面通过一张完整的 Linux 内核运行原理图,可以很方便地让你学习内核知识。在 Linux 内核中,有许多层次、模块、功能调用和函数。要把其中的每一块儿都弄明白是很不容易的,MakeLinux做了一个非常酷的完整的内核交互图,上面非常清晰地标注了每一个组件部分及之间的关系,这张Linux内核交互图可以很好的帮助你不用一一细读 Linux 内核代码,就能弄明白各个内核子系统间复杂的内部联系。因为比较大,所以这里我做个拆分。
这张图上包含有超过400个关键函数,这400个关键函数被分进了一些主要的子系统,彼此之间的关系用连线标明了,清晰明了。
考虑到很多朋友可能需要原图,所以放网络云了,大家私信 “内核” 就可以领取了。也希望大家帮忙多多转发,谢谢~
❸ 简述Linux内核和Linux发行版的区别.DNY版
做服务器运维工作,要经常和Linux的版本号打交道,但一直搞不明白Linux内核和Linux发行版到底是个啥东西。其实要理解Linux内核和Linux发行版之间的关系,只要能理解下面的关系就可以了:
1.类似于游戏引擎《虚幻4》和游戏《绝地求生》之间的关系。没有虚幻4这款引擎,就没有绝地求生的游戏,但是有了虚幻4这款引擎,可以开发各种各样的游戏。
2.类似于汽车的核心三大件(发动机、变速箱、底盘)和宝马汽车之间的关系。汽车最重要的东西就是发动机、变速箱、底盘,宝马汽车和奔驰汽车可能用的都是同样的发动机,但是宝马汽车和奔驰汽车的外观是完全不一样的。
3.类似于电脑的核心硬件(CPU、内存、硬盘、主板、显卡)和戴尔电脑之间的关系。不管是联机的电脑,还是戴尔的电脑,CPU都是Intel或者AMD的。
4.类似于安卓系统和华为手机或者说和华为手机操作系统之间的关系。三星、华为、小米、Vivo这些手机的操作系统都是安卓的操作系统,除去手机硬件的外观不说,在操作使用上就存在差异。并且同是华为的品牌,手机型号不同,使用的安卓的内核版本号也不相同。
简单的说,内核就是内部的核心的东西,大家的内核都是一样的,发行版对应的则是外部的东西,例如功能、特性、外观、操作啊,大家的发行版都是不一样的。
Linux内核是Linux操作系统创始人主持的网站www.kernel.org上发布的操作系统的最基本的那些东西。Linux发行版则是在前述那些东西的基础上添加了一些工具、软件,构成的一套庞大复杂的操作系统。虽然内核都是一样的,但添加部分各不相同,这就构成了不同的发行版本。Linux本身指的是一个操作系统内核,只有内核是无法直接使用的。我们需要的是可以使用的操作系统,是一个包含了内核和一批有用的程序的一个集合体,这个就是Linux发行版。其中,Ubuntu、RedHat就是Linux的不同的发行版。
外延1:既然内核这么牛逼,那么Linux的内核长啥样儿,干啥的?
参考1: https://www.cnblogs.com/yuanqiangfei/p/10225202.html
文中给出了Linux内核的整体架构。根据内核的核心功能,Linux内核提出了5个子系统,分别负责如下的功能:1. Process Scheler,也称作进程管理、进程调度。2. Memory Manager,内存管理。3. VFS(Virtual File System),虚拟文件系统。4. Network,网络子系统。5. IPC(Inter-Process Communication),进程间通信。
到此打住,不再继续研究Linux内核了,否则偏离了文章的主题,而且Linux内核这方面的知识也不是一两天就能掌握的。
外延2:既然Linux有内核,那么Windows有内核么?
参考2: https://www.cnblogs.com/skyer/p/8608113.html
Windows显然也是有内核的说法的,只不过一个内核版本对应一个发行版本。说到这我真要吐槽一把Linux的版本问题,做服务器运维,经常遇到因为Linux的版本不同,导致应用程序死活装不上,库文件版本号死活对不上,依赖包死活找不到......这些一提起来就让人恶心的问题。
外延3:Linux内核版和发行版之间大致是怎么一种联系?
参考3: https://www.jianshu.com/p/f96880637e42
通过上面的解释,当我们的头脑里能区分出内核版和发行版的概念之后,再看两者之间的关系,就很清晰了。
外延4:如何查看Linux内核版本号和发行版本号?
参考4: https://blog.csdn.net/haiziccc/article/details/90203967
查看操作系统版本一般有三个命令:
1. lsb_release -a,适用于所有Linux发行版
2. cat /etc/redhat-release,适用于Redhat
3. cat /etc/issue,适用于所有Linux发行版
查看系统内核版本一般有两个命令:
1. cat /proc/version
2. uname -a
❹ Linux内核源码剖析的介绍
《Linux内核源码剖析》是由樊东东,莫澜编着,机械工业出版社于2011年1月1日出版的一本书籍。本书详细论述了Linux内核2.6.20版本中TCP/IP的实现。书中给出了大量的源代码,通过对源代码的详细注释,帮助读者掌握TCP/IP的实现。本书根据协议栈层次,从驱动层逐步论述到传输层,包括驱动的实现、接口层的输入输出、IP层的输入输出以及IP选项的处理、邻居子系统、路由、套接口及传输层等内容,全书基本涵盖了网络体系架构全部的知识点。特别是TCP,包括TCP连接的建立和终止、输入与输出,以及拥塞控制的实现。
❺ linux内核网络实现分析 这本书有全部的么
我读过的书有下面几本,在网上也很容易找到: Linux.Kernel.Development.Second.Edition.chm(中文叫LINUX内核设计与实现,这本书入门很适合的) OReilly.,DElVRD
❻ Linux常用内核网络参数及修改方法
在修改内核参数前,需要注意以下几点:
本文提供以下两种修改Linux实例内核参数的方法。
/proc/sys/ 目录是Linux内核在启动后生成的伪目录,其目录下的 net 文件夹中存放了当前系统中开启的所有内核参数,目录树结构与参数的完整名称相关,如 net.ipv4.tcp_tw_recycle ,它对应的文件是 /proc/sys/net/ipv4/tcp_tw_recycle 文件,文件的内容就是参数值。方法一中修改的参数值仅在当前运行中生效,系统重启后会回滚到历史值,一般用于临时性验证修改的效果。若需要永久性修改,请参见方法二。
❼ Linux微内核(鸿蒙分析)
1、最近鸿蒙炒的火热,19年就说ipc是谷歌fuchsia的5倍,但他当时没有对比宏内核,正常宏内核的ipc效率肯定很高。
我自己觉得微内核确实是体积小了但是外面的那些驱动什么的又需要开发者去开发,这些开发者前期也就只有华为的开发人员去弄
鸿蒙独立了跑到国外谷歌全家桶又是一个不可逾越的鸿沟,GMS用不了国外就没希望,何况fuchsia这个谷歌的备用还在那摆着,所以鸿蒙切入点在国内,以万物互联为主题是最佳发展方式。
个人比较喜欢鸿蒙的一些东西,也相信它一定会成功,或许3年或许更久,但是现在取代安卓是不可能的的,不过打破垄断全新开源,重新定义5G万物互联时代,作为一个学生还是开了眼的。
2、相对与安卓来说全场景、分布式是鸿蒙OS2.0的最大优势,鸿蒙OS2.0首先在分布式能力上经行了提升分布式软总线、分布式数据管理、并提升了分布式安全能力,(手表电视 汽车 中控外加美的九阳老板电器)、EMUI11借鉴了鸿蒙的分布式技术,多屏协同。
3、GPL:谷歌曾提出影响开源世界最大的障碍就是GPL,GPL规定要求代码使用者代码衍生出来的东西永远开源。谷歌为了隔离gpl的开源,提出了Apache(阿帕奇)协议,就是我开源你随便。
谷歌把一个魔改后的linux作为内核封装起来,中间加了一层类库,让其他所有部分对内核的调用,都像是两个软件之间的调用一样,然后把所有涉及到GPL授权的代码全部替换重写,开源并以Apache协议授权。
这就导致linux社区不满,因为它违反了Linux开源精神如果非强制会导致没人愿意开源,2012年安卓在linux分支树上被永远除名
话说回来要不是Apache哪里来的EMUI Flyme Coloros,要是GPL的话那不是给人打工吗。
4、安卓的linux内核包含了权限管理,CPU指令适配、设备驱动等等
微内核简单理解就是:裁剪了一下,更小了,手机平板手表通用,手机摄像头给手表用,内核一样,手机上有摄像头的设备驱动,不同于wifi、蓝牙华为可以通过分布式软总线来实现信息的传递,这一步5G起到了关键作用。关于分布式软总线的介绍在博客最后。
优势1:灵活的全场景适用,不同屏幕大小、功耗和性能要求的设备可以灵活选择,这样一个应用就有可能在多个设备或者华为所说的全设备上运行,这对于5G万物互联来说非常方便
优势2:安全,恶意代码只能在某个模块下运行,不再是宏内核整个root权限下随便运行
5、当前鸿蒙智慧屏上鸿蒙1.0是linux 鸿蒙 liteos三核并存,因为他生存初期必须要保证鸿蒙系统的可用性,他前期要兼容安卓,一点一点替换安卓的驱动等等,开源的世界有现成的就没人会去造轮子。
6、对于鸿蒙的分布式,也就是软硬件资源共享,其实是基于微内核的,宏内核要实现ipc通信就需要用户空间进程调度到内核空间内核空间再到另一个用户进程空间实现资源传递,宏内核的内核空间是共享的,所谓的新建一个进程可以说是只是说新建了自己独立的用户空间,这里面的ipc通信效率目前来说是要比微内核的效率要高的,而华为的分布式ipc是要通过软总线来实现的,如果借助tcp来实现安全可以保证,但是协议繁琐效率降低,这对于我们物联网的交互来说是不可采取的,所以软总线相当于一个魔改的tcp。
分布式软总线将原本计算机网络通讯协议七层结构中的 表示层、会话层、传输层和网络层等协议精简为一层 ,称为 分布式软总线的极简协议 ,能提升有效载荷。
通过报文简化、包头简化、交互简化,基于应用场景的缓冲机制等方式,提升有效的传输负荷、解决传统 TCP/IP 协议过于复杂的协议层次模型、层层增加包头和解包,充分发挥物理通信通道的最大效能。
通过对协议的优化,分布式软总线无线连接、高带宽、低时延、低功耗、安全接入的优点。分布式软总线实现小于20ms的低时延,端到端时延小于20ms,有效吞吐量达到1.2Gbps,抗丢包性达到25%, 高性能IPC将进程间的通信效率提升了5倍 。
简单理解可以把它想象成优化的tcp更快实现资源共享。
❽ linux1.2.13内核网络栈实现源代码分析 怎么样
这段时间一直在为毕业论文纠结,论文题目是关于Linux进程模块的源代码分析与研究。 以前拜读过《操作系统设计与实现》,《Linux内核设计与实现》,《understanding the linux kernel 3rd》等等,桌面还有大把的网络下下来的资料。 初识这本书,是大三时候一位同学跟我提起,当时觉得还没到阅读源代码的程度。一直到做这篇论文,在我最纠结的时候,忽然想起朋友说过这本书,于是下了电子版本。 理所当然,我完全被这本书吸引。 我难掩心中的激动,几乎要欢呼起来,这何尝不是一本可以当做小说阅读的书籍! 这本书不像前两本那样,仅仅只是罗列出Linux的特性,数据结构,相关的技术等等,他是在带领你去走进Linux源代码的世界,顺着代码的调用,一路斩荆披棘,最后带你到底目的地。途中虽然惊险,但一路过来,却是充满了趣味,更是享受到了智力上的成就感。 关于书的语言。 读这本书,仿佛是你的好朋友就坐在你面前跟你讲话,他把Linux源码中的枯燥的理论跟生活中普遍的事物联系起来,像进程的task_struct结构体,相当于我们的“户口本”,进程转换到"zombie”状态,“进程死亡了无法帮自己注销户口登记,要父进程帮忙”等等,这些解释非常地形象。所谓的大师也便是如此,用最通俗的语言把最深奥的道理讲明白,我想,这本书的作者做到了。 此书的不足。 这本书也存在着不足之处。第一点,此书是2001年出版的,所以是以2.4版本的源代码为基础的,而现在已经长期停留在2.6版本了;第二是,书中的图片严重不足,很多原理只要附加张图片便能让读者明了,可是作者花了不少的篇幅去解释而没有附加图片,这很让人费解,或者这是因为录入不是作者本人做的原因;第三,这跟很多国内书籍类似,没有索引,查找代码的讲解是件很痛苦的事情。 距离这本书第一次出版已经有八年的时间了,希望作者能抽出时间再修订,在此基础上做2.6版本源代码的分析。 这是我见过的国内比较好的真正用心去写的计算机书籍,在此之前也只读过一本关于汇编语言的书籍,作者是王爽。依稀还记得当年舍友都睡了的时候,一个人小心翼翼地趴在笔记本前仔细阅读的情景,如今甚是怀念。 这是本好书。
❾ 《Linux内核精髓精通Linux内核必会的75个绝技》epub下载在线阅读,求百度网盘云资源
《Linux内核精髓》(Munehiro IKEDA)电子书网盘下载免费在线阅读
链接:https://pan..com/s/1IkPuS83Etm-rDtH3TdgR3g
书名:Linux内核精髓
作者:Munehiro IKEDA
译者:杨婷
豆瓣评分:7.0
出版社:机械工业出版社华章公司
出版年份:2013-3-1
页数:424
内容简介:
经过近20年的发展,Linux操作系统已经成为当今最成功的开源软件之一,使用广泛,影响深远。随着Linux操作系统功能的不断丰富和完善,Linux内核的源代码也从最初的几万行增加到如今的数百万行,庞大无比,对于Linux内核的研究者和开发者而言,要系统研究Linux内核绝非易事。鉴于此,本书选取了Linux内核的资源管理(CPU、内存、进程等)、文件系统、网络、虚拟化、省电、调试、概要分析、追踪、内核调整等核心主题进行了深入剖析和讲解,总结出了75个能使读者深刻理解Linux内核精髓的技巧和最佳实践。
作者简介
池田 宗广(Munehiro IKEDA),大学时代,亲眼看到X68000的gcc生成比主流编译器还要快好几倍的代码,因此开始确信免费软件/开源软件的可能性。此后,在历经咖啡店店员、生产技术人员、硬件工程师后,终于开始从事Linux内核开发。这个行业最吸引人的就是能够跨公司甚至跨国界与世界最优秀的技术人员进行交流。现居住在美国,爱好音乐演奏,当过鼓手,也当过主唱,最近几年一直在弹贝斯。不管是作为技术人员还是贝斯手都喜欢做幕后工作,只不过天生就不喜欢半途而废。
❿ 一般优化linux的内核,需要优化什么参数
作为高性能WEB服务器,只调整Nginx本身的参数是不行的,因为Nginx服务依赖于高性能的操作系统。
以下为常见的几个Linux内核参数优化方法。
net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syn_retries
net.ipv4.tcp_synack_retries
net.ipv4.ip_local_port_range
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
对于tcp连接,服务端和客户端通信完后状态变为timewait,假如某台服务器非常忙,连接数特别多的话,那么这个timewait数量就会越来越大。
毕竟它也是会占用一定的资源,所以应该有一个最大值,当超过这个值,系统就会删除最早的连接,这样始终保持在一个数量级。
这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。
CentOS7系统,你可以使用sysctl -a |grep tw_buckets来查看它的值,默认为32768,
你可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。
但你不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,
如果同样的客户端再次和服务端通信,就不用再次建立新的连接了,用这个旧的通道,省时省力。
该参数的作用是快速回收timewait状态的连接。上面虽然提到系统会自动删除掉timewait状态的连接,但如果把这样的连接重新利用起来岂不是更好。
所以该参数设置为1就可以让timewait状态的连接快速回收,它需要和下面的参数配合一起使用。
该参数设置为1,将timewait状态的连接重新用于新的TCP连接,要结合上面的参数一起使用。
tcp三次握手中,客户端向服务端发起syn请求,服务端收到后,也会向客户端发起syn请求同时连带ack确认,
假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,
这个重试的过程会持续一段时间(通常高于30s),当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,
正常的连接进不来,这种恶意的半连接行为其实叫做syn flood攻击。
设置为1,是开启SYN Cookies,开启后可以避免发生上述的syn flood攻击。
开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,
如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。
该参数定义系统能接受的最大半连接状态的tcp连接数。客户端向服务端发送了syn包,服务端收到后,会记录一下,
该参数决定最多能记录几个这样的连接。在CentOS7,默认是256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,
实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。
该参数适用于客户端,它定义发起syn的最大重试次数,默认为6,建议改为2。
该参数适用于服务端,它定义发起syn+ack的最大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。
该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口。这个参数适用于客户端,
当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,
这个参数定义随机端口的范围。默认为32768 61000,建议调整为1025 61000。
tcp连接的状态中,客户端上有一个是FIN-WAIT-2状态,它是状态变迁为timewait前一个状态。
该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。
tcp连接状态里,有一个是established状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,
客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,
并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。
比如客户端已经断网了,但服务端上本次连接的状态依然是established,服务端为了确认客户端是否断网,
就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200秒,建议设置为30秒。
该参数和上面的参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端并没有确认,
此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。
默认值为75秒,可以改为3秒。
第10和第11个参数规定了何时发起探测和探测失败后再过多久再发起探测,但并没有定义一共探测几次才算结束。
该参数定义发起探测的包的数量。默认为9,建议设置2。
设置和范例
在Linux下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl -p命令生效