Linux-内核参数笔记
记录内核参数的含义和调整的效果, 主要是记录这些参数的含义或者使用它们的方法, 什么场景下需要调整这个。Linux_Sysctl 参数记录
开始net.ipv4.tcp_max_tw_buckets 对于tcp连接,服务端和客户端通信完后状态变为timewait,假如某台服务器非常忙,连接数特别多的话,那么这个timewait数量就会越来越大。毕竟它也是会占用一定的资源,所以应该有一个最大值,当超过这个值,系统就会删除最早的连接,这样始终保持在一个数量级。 这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。CentOS7系统,你可以使用sysctl -a |grep tw_buckets来查看它的值,默认为32768,你可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。 但你不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,如果同样的客户端再次和服务端通信,就不用再次建立新的连接了,用这个旧的通道,省时省力。
net.ipv4.tcp_tw_recycle 在最新版本的内核中, 这个已经被移除, 这个参数在具有nat网络结构和行为的时候会导致出现异常。
net.ipv4.tcp_tw_reuse 该参数设置为1,将timewait状态的连接重新用于新的TCP连接,这个参数本身其实开开启就可以了, 他可以快速的回收处于timewait的socket, 生效在客户端。
net.ipv4.tcp_syncookies tcp三次握手中,客户端向服务端发起syn请求,服务端收到后,也会向客户端发起syn请求同时连带ack确认,假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次。 这个重试的过程会持续一段时间,当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,正常的连接进不来,这种恶意的半连接行为其实叫做syn flood攻击。 设置为1,是开启SYN Cookies,开启后可以避免发生上述的syn flood攻击。开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。
net.ipv4.tcp_max_syn_backlog 该参数定义系统能接受的最大半连接状态的tcp连接数。客户端向服务端发送了syn包,服务端收到后,会记录一下,该参数决定最多能记录几个这样的连接。我的CentOS7系统,默认是256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。
net.ipv4.tcp_syn_retries 该参数适用于客户端,它定义发起syn的最大重试次数,默认为5,建议改为2。
net.ipv4.tcp_synack_retries 该参数适用于服务端,它定义发起syn+ack的最大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。
net.ipv4.ip_local_port_range 该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口。这个参数适用于客户端,当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,这个参数定义随机端口的范围。默认为32768 61000,建议调整为1025 61000。
net.ipv4.tcp_fin_timeout tcp连接的状态中,客户端上有一个是FIN-WAIT-2状态,它是状态变迁为timewait前一个状态。该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。
net.ipv4.tcp_keepalive_time tcp连接状态里,有一个是keepalived状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。 比如客户端已经断网了,但服务端上本次连接的状态依然是keepalived,服务端为了确认客户端是否断网,就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200(单位为秒),建议设置为30。
net.ipv4.tcp_keepalive_intvl 该参数和上面的参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端并没有确认,此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。 默认值为75秒(单位为秒),可以改为3。
net.ipv4.tcp_keepalive_probes 第10和第11个参数规定了何时发起探测和探测失败后再过多久再发起探测,但并没有定义一共探测几次才算结束。该参数定义发起探测的包的数量。默认为9,建议设置2。
net.ipv4.tcp_slow_start_after_idl 这个推荐直接设置为0 , 在tcp连接多而且数据交互频繁的时候, 这个参数没有特别大的影响, 但是对于间隔一段时间这类的网络请求, 确实是会有影响的, 会导致走 慢启动 拉长延迟 sysctl -w net.ipv4.tcp_slow_start_after_idle = 0
echo "net.ipv4.tcp_slow_start_after_idle = 0" >> /etc/sysctl.conf
更多tcp协议的网络流量控制 [[../Network/Network_tc控制流量-update|Network_tc控制流量-update]]Amazon Linux 2 完整的sysctl参数 [[Linux_Sysctl 参数记录]]Linux操作系统触发NMI中断调试和Kdump [[Linux_DebugLinuxCrashOnEC2]]
离线安装.Net3.5
windows 新版本淘汰了.net 3.5,默认不安装。但是在没有网络的时候需要安装就很尴尬,我平时也没有备份这种安装包的习惯。所以找到了如下的解决方案,使用微软的映像部署工具进行安装,步骤如下:
方法
挂载微软的官方镜像,或者放入安装光盘。
打开cmd或者Powershell
使用这样的一个命令就可以安装完成了。dism.exe /online /enable-feature /all /featurename:NetFX3 Source:Z:\sources\sxs
等待系统处理命令,完成。
Note: 命令中可以不添加/all,最后一条参数中的Z盘符改为镜像挂载所在的盘符即可
grub2手动修复引导错误
grub2引导错误的手动解决方法
Grub是什么
引用百度百科
GNU GRUB(简称“GRUB”)是一个来自GNU项目的启动引导程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。GNU GRUB的前身为Grand Unified Bootloader。它主要用于类Unix系统;同大多Linux发行版一样,GNU系统也采用GNU GRUB作为它的启动器。Solaris从10 1/06版开始在x86系统上也采用GNU GRUB作为启动器。
引用fedora官方wiki
GRUB 2 is the latest version of GNU GRUB, the GRand Unified Bootloader. A bootloader is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system kernel, (Linux, in the case of Fedora). The kernel, in turn, initializes the rest of the operating system.GRUB 2 has replaced what was formerly known as GRUB (i.e. version 0.9x), which has, in turn, become GRUB Legacy.Starting with Fedora 16, GRUB 2 is the default bootloader on x86 BIOS systems. For upgrades of BIOS systems the default is also to install GRUB 2, but you can opt to skip bootloader configuration entirely.
修复grub2引导程序开机失败一般情况下系统的grub文件不会丢失,但是有的时候比如我们进行了系统设置的更改或者文件的误删除会导致系统无法正常启动,这个时候我们需要对grub进行手动的配置,才能是计算机正确的进入系统之中,进入系统之后只要重新生成grub引导文件,就可以让系统重启自动完成引导进入系统了。
指出/boot位置
指定grub的硬盘引导分区,也就是/boot所在的硬盘分区grub> root (hd0,0)
指出vmlinuz内核文件
指出kernel所在的分区,主要是vmlinuz内核文件所在的位置grub> kernel /vmlinuz
指出initrd所在的分区,指定初始化文件所在的位置grub> initrd /initrd
启动
文件锁定成功之后,就可以启动系统grub> boot
在系统中重新安装和更改grub2安装或者重新安装grub2(非必须-如果有需要的时候执行)安装grub2到硬盘分区,一般为硬盘的第一个分区的开始位置
传统引导方式安装grub2[root@localhost /]# grub2-install /dev/sda
EFI引导安装grub2[root@localhost /]# dnf reinstall grub2-efi shim
重新生成grub配置文件使用grub2-mkconfig生成新的grub2配置文件,同时指定引导时读取该文件不同的安装方式有不同的命令
标准的传统引导安装方式[root@localhost /]# grub2-mkconfig -o /boot/grub2/grub.cfg
EFI引导方式[root@localhost /]# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
Windows&Linux双系统修复windows和linux的双系统请注意安装顺序,可以减少很多麻烦
先安装windows - 然后安装linux
如果先安装了linux,那么在安装windows之后,系统的MBR会被windows覆写,导致linux系统无法正常引导,这个时候需要使用livecd进行修复grub2,让grub2重新安装并且控制引导系统的分区
删除系统更新之后多余的启动项系统更新之后总是会多很多的旧版本内核的启动项,每次启动的时候看起来都很乱,简单操作就可以去掉多余的启动项,如下:
暴力方式
在boot目录下面强制删除内核文件,然后重新生成grub2.cfg即可
[root@localhost boot]# rm -rf vmlinuz-4.13.9-300.fc27.x86_64
[root@localhost boot]# rm -rf vmlinuz-4.14.5-300.fc27.x86_64
重新生成配置文件:
[root@localhost boot]# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.14.11-300.fc27.x86_64
Found initrd image: /boot/initramfs-4.14.11-300.fc27.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-2fbfdacc99ad4255953ae8b2ec521e9d
Found initrd image: /boot/initramfs-0-rescue-2fbfdacc99ad4255953ae8b2ec521e9d.img
done
正确方式
使用dnf命令卸载旧内核: [root@localhost /]# dnf remove kernel-4.13.9-300.fc27.x86_64
[root@localhost /]# dnf remove kernel-4.14.5-300.fc27.x86_64
如何使用微软官方镜像重装系统
注意,这是一个完整且详细的新手教程!
一、写在最前面有几句有用的建议,在这里先写,能让你的电脑长久运行良好:- 国内的软件普遍都带有广告,这不是Windows的锅- 不要使用360系列的产品 ,有人和我说企业版特别良心,但是我没用过,欢迎尝试后给我反馈- 所有软件都从官方网站下载,不要图方便使用软件升级助手,或者电脑管家- 安装程序请仔细观察是否有捆绑软件,一定取消勾选的捆绑软件- 注意观察安装程序界面的角落位置|折叠菜单|高级选项|更多,否则你的电脑一定会“自动”多很多奇怪的东西- 如果可以尽量使用微软官方的系统,第三方系统或者Ghost系统确实方便了你的安装过程,但是你一定会被广告和捆绑的软件折磨的不要不要的~最重要的是,不能确定是否会有后门程序,谨慎使用Onekey-Ghost和YLMF- 最后一点千万注意,系统优化类软件除非你清楚这个软件都更改了那些设置,否则不要使用,请相信没有任何一个第三方公司比微软更了解自己的产品
二、环境及工具
可以正常使用的 计算机A(也就是可用的电脑)
需要重装系统的 计算机B(一定要保证开机出现Logo,如果开机Logo都没有,请确认计算机是否通电;检查显示器是否正常;如其他情况请送维修。)
4G 空间以上的 空U盘
Rufus (后面介绍这个工具的用途)Rufus-官方网站Rufus-下载链接
微软官方 的系统镜像文件MSDNitellyou-搬运官方的非官方下载点MSDNitellyou-Windows10中文64位下载链接ed2k
最重要的一点,最好有网,没有会麻烦些
三、原理部分为计算机安装操作系统过程
计算机的简要启动过程: 通电 - 硬件自检 - 寻找操作系统所在硬盘 - 启动操作系统
安装系统难理解的是在硬件自检之后,直接从U盘中读取系统安装程序,然后将系统这个大程序写入硬盘的相应分区内
四、开始安装操作部分 – 计算机A接下来的操作都是在计算机A下完成的~
Rufusrufus是用来制作可启动U盘的一款绿色应用程序
下载系统镜像文件上面提到的系统镜像文件以Win10-1709为例,这是当前最新版本的Windows,下载之后应该是一个后缀名为.iso的文件
使用Rufus制作可启动U盘
双击打开Rufus,插入U盘,确认最顶部设备已经识别你的空U盘
点击箭头指向的按钮,选择刚才下载的镜像文件
加载镜像文件,选项如图,选择开始
点击确认
开始写入 , 等待
U盘制作成功
操作部分 – 计算机B下面的部分转移到重新安装系统的计算机B上面来了~
从U盘中启动系统安装程序
开机按下电源按键之后,请反复按下F12,直到屏幕变成这个样子~
选择引导设备菜单,请选择刚刚制作好的U盘,一般设备名称会是USB……或者Sandisk……或者Kingston……这类的名字,或者如上图–通用闪存设备,回车选择后安装程序自行启动
选择语言,没什么特殊要求就中文就可以了,当然如果需要请下载EN版本的镜像,或者多国语言版,在下拉菜单中选择需要的语言
点击现在安装…
稍等
这里有两种情况:
有密钥的情况请直接输入,系统会被激活,安装完成之后就是官方正版的系统;
没有密钥,只是需要在系统安装完成之后再次输入密钥或者安装一个补丁就好;
这个位置就很随意了,选择你需要的版本,我安装的是一个WIN10专业版
只能接受,接受才能下一步
这里也是两种情况:
如果你的计算机中本身有WIN7、8、8.1,可以选择直接升级,但是升级之后会有Windows Old文件夹占用大量C盘空间,清理会很麻烦;
如果就已经打算重新安装了,请确认数据已经备份或者无用,之后这里选择自定义,进入下一步;
Note: 如果你的计算机中有重要数据请自行备份,
- 下面开始进行的操作会直接修改硬盘的内容!!! - 下面开始进行的操作会直接修改硬盘的内容!!! - 下面开始进行的操作会直接修改硬盘的内容!!!
硬盘分区关键词: 驱动器0 是指物理硬盘编号0,有几块硬盘就顺序向下编号0/1/2/3… 分区1 一般是指物理硬盘的第一个分区,通常对应了CDEF不同的字母,同样有几个分区就顺序向下编号1/2/3… 主分区 是我们在系统内使用的硬盘分区,主分区从上到下分别是CDEF盘,图中只有一个主分区,所以我的系统安装完成之后只有一个C盘
图示数字说明: 1-删除 硬盘分区会让当前的硬盘空间释放为可用空间,用于打破之前划分的分区,比如可以将分区CDEF的EF删除,合并成新的E盘
2-格式化 格式化是清空当前选择分区内的所有数据,所有分区我们都需要格式化
3-新建 新建分区需要我们指定大小,比如新建的C盘我希望有100G,那么我需要在新建之后输入100*1024M=102400,这样就新建了100G的新分区
4-类型 中,我们只需要修改和关注主分区即可,其他保留就可以
Note: 点击下一步之前,一定确认我们选择的是 由上到下的第一个主分区 ,因为系统会安装到高亮选择的主分区内,请 检查 之后在点击下一步
点了 下一步 就开始安装咯, 之前的已经没有办法再更改了 ,除非从1开始再来一次…..
结束了,等待它自动重启看看全新的系统吧~
五、配置新系统激活 淘宝 激活码 很便宜的
安装驱动官方网站 或者 驱动精灵最好不用鲁大师和360,真的
其他选项待续吧….累了…
六、软件推荐微信QQ这些都是必备的,我就不说了……说一些好用的软件但是少有人知道的……我平时不安装电脑管家,杀毒软件就一个小红伞,如果真的不放心会在加一个火绒,基本上够了,小红伞对硬盘要求还挺高的,如果觉得安装小红伞卡,就安装小A吧,Avast……
软件清单如下:
Notepad++ 替代Windows记事本的最佳方案,支持代码高亮哦~
Potplayer Windows下最简单好用的播放器~
Everything Windows搜索神器~
Firefox 浏览器……我不知道该怎么说,又爱又恨吧~
CCleaner Windows下的老牌清理软件….还不错~
Office 2016 - 全家桶 ed2k Office2016 ed2k链接,请直接迅雷下载~
Bandizip 美观友好的解压缩软件,省心免费~
Mactype Windows字体渲染优化,解救windows默认的字体渲染,配置省事,效果明显~
Firefox-Openh264的问题
fedora27中Firefox插件OpenH264不启用
环境OS:Fedora 27 WorkstationSoftware: Firefox 57
问题Firefox的插件中提示OpenH264 未启用,不能正常使用,打开视频站点不能播放视频。在插件中调整插件状态为 Always Activate,插件状态改变为将被安装,但是无论的等待多久这个插件的安装状态不会改变,依旧不能正常工作。
解决办法查找到官方WIKI,给出了如下的解决办法:
在Fedora默认给出的官方源中,有一个名称是:fedora-cisco-openh264.repo
这个源默认关闭,开启它sudo dnf config-manager --set-enabled fedora-cisco-openh264
安装如下两个插件sudo dnf install gstreamer1-plugin-openh264 mozilla-openh264
重启Firefox查看插件状态已经恢复正常,启动openh264插件即可。
Openh264测试页Simple mozRTCPeerConnection Video Test
Hexo+Github建立个人博客记录
建立Blog,记录过程所有的配置都是在Fedora 27 Workstation版本下进行,Windows配置环境恶心了我很久所以不做介绍。
Hexo部署环境Hexo运行在Linux环境中的配置及其简单,只需要确认系统中安装了git和Nodejs就好,在Fedora27中已经默认有Git软件包,如果需要安装git使用dnf install -y git就好。目前我们只需要添加nodejs就可以了,准备工作开始~
使用git version 看看是否已经安装了git。
安装Node.jsNode.js的安装只需要两条命令,按照顺序执行就好:
用于系统的更新,基本上等待命令结束就可以,只是保证运行环境的所有软件包都是最新的状态。
[root@localhost test]# dnf update -y
用于安装Nodejs,dnf管理器会自动配置需要的依赖软件,也是等待就好,没有特别的操作。
[root@localhost test]# dnf install -y nodejs
安装Hexo
接下来需要选择一个你想安装的目录,例如:/root/Document/Hexo/test
那么需要确定工作目录并且切换过去
[root@localhost test]# cd /root/Document/Hexo/test
之后所有的操作都会在这个目录或者它的子目录。
[root@localhost test]# npm install hexo -g
安装结束之后,查看是否安装成功,使用:
[root@localhost test]# hexo -v
如输出如下信息则说明安装成功,可以执行下一步。 [root@localhost test]# hexo -v hexo: 3.4.4 hexo-cli: 1.0.4 os: Linux 4.13.13-300.fc27.x86_64 linux x64 http_parser: 2.7.1 node: 8.9.3 v8: 6.1.534.48 uv: 1.16.0 zlib: 1.2.11 ares: 1.10.1-DEV modules: 57 nghttp2: 1.25.0 openssl: 1.0.2m-fips icu: 57.1 unicode: 8.0 cldr: 29.0 tz: 2016
失败解决方案
失败请更换 cnpm 或者 更换淘宝源重试。
如果安装,确认自己在正确的目录下,执行npm install重试
安装 Hexo-server安装Hexo-server主要是作为本地测试使用,通过本地localhost:4000访问来预览,方便调整。
使用如下命令执行安装:
[root@localhost test]npm install hexo-server -g
执行启动hexo-server,确认是否可以正常使用:
[root@localhost test]hexo s OR[root@localhost test]hexo server
输入如下结果则正常启动:
[root@localhost test]# hexo s INFO Start processing INFO Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.
这里服务器已经启动了,使用Ctrl+C停止服务,恢复正常的Shell窗口。
初始化Hexo
这里需要创建新的Blog目录,例如:/root/Document/Hexo/test
在test目录下执行:
[root@localhost test] hexo init
初始化会将Blog所需的文件放入test文件夹中,这个目录就是我们需要推到github上面的东西。也就是整个博客的根目录。
配置Git这部分的内容已经和我们本地的计算机没有什么太大的关系了,我们需要去Github上面注册一个账户,在这个账户里面添加一个新的repo,例如: test.github.io我们在本地建立的site使用git工具,将整个blog发布到对应的软件仓库中,接下来我们需要配置git的信息使用命令配置git的用户名和邮箱:
[root@localhost test] git config --global user.name "yourname"[root@localhost test] git config --global user.email "youremailaddress"
添加SSH认证使用ssh进行与github的通信可以免去我们每次都输入用户名密码的繁琐,因此我们需要为本地的计算机生成一个SSH的KEY。
命令如下:
[root@localhost test] ssh-keygen -t rsa -C "your_email@example.com"
期间会让我们输入密码进行验证,如果这个位置输入密码,今后每次连接到github的时候,都需要输入这个密码才能连接,如果这里我们不输入密码直接回车,今后连接的时候就不需要密码了,推送的内容会直接被推送,之后返回结果。
生成的密钥会直接放在当前用户家目录下的隐藏文件夹里,因此我们把他找出来:
[root@localhost test] cd ~/.ssh
复制id_rsa.pub文件内的所有内容,粘贴到github的添加SSH密钥位置。成功。
连接Github测试连接到Github是否能够成功,使用如下命令:
[root@localhost test] ssh -T git@github.com
如果上一部分生成SSH密钥的时候输入了密码,请在这个命令运行之后按照提示输入密码,返回结果如下:
[root@localhost .ssh]# ssh -T git@github.comHi test! You’ve successfully authenticated, but GitHub does not provide shell access.
我们已经成功的连接上了Github上面的repo,github的配置结束了~
配置Hexo-deployergit可以将我们的blog推送到repo上面去,但是本身我们也可以使用hexo提供的工具来进行blog的更新。
直接编辑hexo的配置文件: _config.yml
[root@localhost test]# vim _config.yml
修改配置文件中的这个部分,如下是最终的修改结果:
77 # Deployment 78 ## Docs: https://hexo.io/docs/deployment.html
79 deploy: 80 type: git 81 repo: git@github.com:test/test.github.io.git 82 branch: master
现在将我们本地的默认站点推送到Github上面去试试吧!
[root@localhost test]# hexo dINFO Deploying: gitINFO Clearing .deploy_git folder…INFO Copying files from public folder…INFO Copying files from extend dirs…[master caa83a9] Site updated: 2017-12-27 18:26:01 1 file changed, 63 insertions(+), 11 deletions(-)To github.com:test/test.github.io.git62dcd56..caa83a9 HEAD -> masterBranch master set up to track remote branch master from git@github.com:test/test.github.io.git.INFO Deploy done: git
输出最后Deploy done,就表示我们的原始页面已经上传成功了~,访问Repo的名字就可以直接看到初始blog的样子了。
后续插件安装的记录:
[root@localhost ~]# cnpm list -g --depth 0
/usr/lib
├── cnpm@6.0.0
├── hexo@3.4.4
├── hexo-cli@1.1.0
├── hexo-generator-archive@0.1.5
├── hexo-generator-category@0.1.3
├── hexo-generator-index@0.2.1
├── hexo-generator-search@2.4.0
├── hexo-generator-tag@0.2.0
├── hexo-render-pug@2.1.0
├── hexo-site@0.0.0
└── npm@6.4.1
Hexo常用命令说明Hexo目录下常用的命令有:
[root@localhost test]# hexo s //启动hexo本地服务进行blog预览
[root@localhost test]# hexo new TITLE //新建文章
[root@localhost test]# hexo clean //清除缓存
[root@localhost test]# hexo g //重新生成站点页面文件
[root@localhost test]# hexo d //推送到github
添加鼠标爆炸点击效果在/themes/yelee/layout/layout.ejs的文件中,文件开始位置加入如下字段:
<head>
<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas>
<script type="text/javascript" src="//cdn.bootcss.com/animejs/2.2.0/anime.min.js"></script>
<script type="text ...
Light From Twitter
开一个单独的文档记录一些想要保存 或者 感觉自己需要学习的内容。
听说你们没有女朋友,不好打发时间,玩起来:https://t.co/bFsK2OfHVc
— plantegg (@plantegg) May 5, 2024
我也推荐一个Neso Academy 的操作系统课,目前油管上英文教这门课就这个我觉得教的最好:https://t.co/yQtZdRgYBx https://t.co/vdJYgIRnPd pic.twitter.com/g1QUBjCVQm
— Susan the dice tree (@feltanimalworld) May 26, 2024
这是我最推荐的 CS 专业必看的操作系统课程,由哈工大出品,哈工大的李治军教授主讲。
需要懂一点点的 x86 汇编,看完之后编程水平会突飞猛进。
也可以购买他编写的教材《操作系统原理、实现与实践》。因为是教材,所以很便宜。https://t.co/HoKyedPADk pic.twitter.com/OBgqPBW8qi
— Austin(坚持每周分享✊) (@austinit) May 26, 2024
之前和读者聊到,“现在envoy用来做七层网关,要想达到好用,就差几个关键技术点没解决”。我决定开一个系列,不定期更新,写写 Envoy 目前还做得不够好的地方。https://t.co/xc52r1P4Wi 今天是第一篇,讲讲路由变更粒度。
— Zexuan Luo (@spacewander_lzx) May 26, 2024
还记得 Google 之前搞的用 eBPF 来做 CPU Schedule 的 Customize 么?https://t.co/wW0F5DESoN最近内核的老哥们很认真的在推这个事 https://t.co/plkrY8Y5a7额外推荐一个视频https://t.co/ruenu06Oirhttps://t.co/3Q9lvrISfh
— NadeshikoManju@摇曳露营 S3 放送中 (@Manjusaka_Lee) May 9, 2024
BTW,几年前写过一个排查内核侧,特别是驱动内侧使用的工具…:https://t.co/lRbDGBy0wX
已经用它找出过一大堆现网问题了,比如 nv,intel mlx 驱动分配内存却用任何工具看不出来的地方这个就可以瞬间看到… 缺点是需要重现现场,它需要动态抓取页面分配事件,前天还用这个迅速排查了几个问题…
— silosrc (@silosrc) April 30, 2024
Course on Linux debugging, profiling and tracing training by @bootlincom
Slides: https://t.co/OxmADoTOEHLab exercises: https://t.co/3Irhh332w1Lab material (.tar.xz): https://t.co/psVOfoxSbW#Linux #linuxkernel pic.twitter.com/s9J4ud9nuQ
— 0xor0ne (@0xor0ne) April 25, 2024
又有一本入坑内核开发的好书
《Linux Kernel Programming by Kaiwan N Billimoria》第二版。这本书最大的特点是:新+保姆式上手。
第一版基于内核5.4,第二版6.1,内容很新。(在内核和模块开发资料当中很难得)其次对于第一次涉及这个领域的小伙伴也非常友好,从安装虚拟机到第一次编译内核(续 pic.twitter.com/vXFMzN4MYt
— Hema shushu (@hemashushu) March 20, 2024
发现身边的小伙伴 Git 用的不是很熟练,我推荐了三个教程给他们。第一个是入门练手的:可以通过动画非常直观的了解 git 各种操作背后的原理,如 git tree 是如何生成和合并的。
非常推荐!https://t.co/SKGIAf6McNhttps://t.co/64guGEBMt5
还有两个是…..⬇️⬇️
— Guangzheng Li (@iguangzhengli) June 7, 2023
https://t.co/JQMNcjxskH
发现一个开源的小游戏还挺有趣,可以通过游戏来学习 git~ https://t.co/PNrfhrrMJf pic.twitter.com/53xXonlY0D
— Guangzheng Li (@iguangzhengli) April 22, 2024
Best Practices for OpenZFS L2ARC in the Era of NVMe (SDC 2019)https://www.youtube.com/watch?v=yHgSU6iqrlE
blktrace 命令说明
Blktrace 命令是一款 Linux 内核块设备 I/O 层的跟踪工具。它可以获取 I/O 请求队列的各种详细情况,包括进行读写的进程名称、进程号、执行时间、读写的物理块号、块大小等。
一个I/O请求进入block layer之后,可能会经历下面的过程:
Q Remap: 可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备
G Split: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O
I Merge: 可能会因为与其它I/O请求的物理位置相邻而合并(merge)成一个I/O
D 被IO Scheduler依照调度策略发送给driver
C 被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成IO请求之后再把结果发回。
常见的状态切换 Q–G–I–D–C
259,2 0 2 0.000001080 7134 Q W 756856 + 800 [dd]
259,2 0 3 0.000004247 7134 X W 756856 / 757368 [dd]
259,2 0 4 0.000005806 7134 G W 756856 + 512 [dd]
259,2 0 5 0.000008792 7134 I W 756856 + 512 [dd]
259,2 0 6 0.000012844 7134 G W 757368 + 288 [dd]
259,2 0 7 0.000013202 7134 I W 757368 + 288 [dd]
259,2 0 8 0.000031708 1830 D W 756856 + 512 [kworker/0:1H]
259,2 0 9 0.000034250 1830 D W 757368 + 288 [kworker/0:1H]
259,2 0 10 0.001598439 7135 C W 756856 + 512 [0]
259,2 0 11 0.001689880 7135 C W 757368 + 288 [0]
# 主,从设备号 , 起始Sector 为0 , 写几个, 时间 , pid , 状态 , R/W , 未知
保留 blktrace 的结果为 bin 文件。
blktrace -d /dev/sdb
使用blkparse 分析已经有的记录
# 记录性能数据 到 文件。
root@ip-172-31-11-235:/home/ec2-user|⇒ blktrace -d /dev/nvme0n1p1
^C=== nvme0n1p1 ===
CPU 0: 1 events, 1 KiB data
CPU 1: 0 events, 0 KiB data
Total: 1 events (dropped 0), 1 KiB data
# 每个cpu设备每个设备存储一个单独的文件。
root@ip-172-31-11-235:/home/ec2-user|⇒ ll
total 4.0K
-rw-r--r-- 1 root root 56 Nov 4 17:55 nvme0n1p1.blktrace.0
-rw-r--r-- 1 root root 0 Nov 4 17:55 nvme0n1p1.blktrace.1
root@ip-172-31-11-235:/home/ec2-user|⇒ blkparse -i nvme0n1p1.blktrace.0
# 格式化分析的数据为bin。
root@ip-172-31-11-235:/home/ec2-user|⇒ blkparse -i nvme0n1p1 -d nvme0n1p1.blktrace.bin
# 使用一个简易的图形方式分析结果。
root@ip-172-31-11-235:/home/ec2-user|⇒ btt -i nvme0n1p1.blktrace.bin