欢迎来到我的个人博客
- 记录学习的过程 ☁️
- 分享有趣的知识 📘
欢迎来到我的个人博客
前言 此处是本人基于小林 coding 等网站进行的笔记,主要目的是在记笔记的过程中帮自己记忆。 TCP/IP 网络模型 应用层 (应用层协议 http,websocket 等) 传输层 (TCP/UDP):负责端到端通信 网络层 (IP 层):负责网络包的封装、分片、路由、转发 网络接口层:负责网络包在物理网络里的传输 Linux 网络是如何收发网络包的(待完善) 此部分博主要复习一下之前阅读过的《深入理解 linux 网络》,现在的版本是直接从小林 coding 上总结的,缺乏细节。 Linux 是如何收到网络包的 当网卡收到一个网络包,会通过 DMA 将网络包写入 ring buffer。然后触发硬中断,硬中断会暂时屏蔽终端,表示已经知道内存中有数据了,网卡在此期间再收到数据包直接写入内存就可以了。然后硬中断还会发起软中断,然后停止屏蔽终端。 内核中的 ksoftirqd 线程专门负责软中断的处理,会轮询处理数据。ksoftirq 线程会从 ring buffer 中获取一个数据帧,用 sk_buff 表示,交给网络协议栈逐层处理。 网络包首先会进入网络接口层,在这一层检查报文的合法性,然后找出网络包的协议(IPV4、IPV6),再去掉帧头帧尾交给网络层。 到了网络层,取出 IP 包,判断下一步是要转发出去还是交给上层。当确认是要交给本机上层后,就会从 IP 头里看看上一层协议的类型是 TCP 还是 UDP,接着去掉 IP 头,然后交给传输层。 传输层取出 TCP 或 UDP 头,根据四元组「源 IP、源端口、目的 IP、目的端口」作为标识,找出对应的 Socket。并把数据放到 Socket 的接收缓冲区。 应用层调用 Socket 接口,将内核的 Socket 接收缓冲区的数据拷贝到应用层缓冲区,然后唤醒用户进程。 Linux 是如何发送网络包的 应用程序会调用 Socket 发送数据包的接口。应用程序会从用户态陷入到内核态的 Socket 层,然后内核会申请一个内核态的 sk_buff 内存,将用户数据拷贝到 sk_buff,并将其加入到发送缓冲区。 网络协议栈从 Socket 发送缓冲区取下 sk_buff,并按照 TCP/IP 协议栈从上到下逐层处理。 如果是 TCP 协议,需要先 拷贝一个新的 sk_buff 副本,因为 sk_buff 后续在调用网络层,最后到达网卡发送完成的时候,这个 sk_buff 会释放掉。而 TCP 协议是支持丢失重传的,在收到对方的 ACK 之前,这个 sk_buff 不能被删除。 接着对 sk_buff 填充 TCP 头。sk_buff 头部预留了协议栈的空间,通过前移 data 指针来逐层填充协议头。 然后数据包交给网络层,网络层会选取路由(确认下一跳的 ip)、填充 IP 头、netfilter 过滤,对超过 MTU 大小的数据包进行分片。接着交给网络接口层处理。 网络接口层通过 ARP 协议获得下一跳的 MAC 地址,然后对 sk_buff 填充帧头和帧尾,然后将 sk_buff 放到网卡的发送队列中。 然后会触发软中断告诉网卡区驱动,有新数据包要发送。驱动程序会从发送队列中读取 sk_buff,将这个 sk_buff 挂到 RingBuffer 中,然后将 sk_buff 映射到网卡可访问的内存 DMA 区域,最后触发真实的发送。 当发送完成的时候,网卡会触发硬中断释放 sk_buff 内存和 ring buffer 的内存。最后,当收到这个报文的 ACK 后,传输层就会释放原始的 sk_buff。 发送网络数据涉及几次内存拷贝? 调用发送数据的系统调用时,用户数据会拷贝到 sk_buff 内存 使用 TCP 协议时,从传输层进入网络层的时候,会将 sk_buff 拷贝一个副本用于发送 当 IP 层发送发现 sk_buff 大于 MTU 时会再申请额外的 sk_buff,将原来的 sk_buff 拷贝为多个小的 sk_buff。 键入网址后发生的事情 浏览器解析 URL,生成发送给 web 服务器的请求信息 查询 DNS,获取域名的 IP 地址(DNS 有缓存) 获取 IP 后要建立 TCP 连接,经过三次握手后,就建立好连接,然后将要发送的请求信息封装为 TCP 包,TCP 负责将数据可靠交付给服务端。如果信息过长,需要进行分包。TCP 头部需要填写服务端和客户端的端口号。封装好后的包会交给下一层 IP 层。(在实际发送数据包前,如果是 https,还需要进行 tls 四次握手,在 tcp 基础上建立 tls 连接) IP 层将拿到的 TCP 包再封装为 IP 包,需要填写源地址 IP 和目的地址 IP,目的地址 IP 通过 DNS 解析得到。源 IP 在本机有多块网卡的情况下,使用路由表规则判断用哪一个网卡作为源地址 IP。 有了 IP 头部后,网络包还需要在 IP 头前面加上 MAC 头部。发送方的 MAC 头部直接从网卡的 ROM 中读取,接收方的 MAC 地址通过查路由表得到下一跳 IP,然后通过 ARP 协议在局域网内广播,获取下一跳 IP 对应的 MAC 地址(ARP 也有缓存) 封装好 MAC 包后交给网卡,网卡负责将数字信息实际转换为电信号发出去。 发送的包途径到交换机,交换机工作在二层,没有自己的 MAC 地址,它根据自己内部的 MAC 表决定发送到哪个网口,如果没有记录,则将该包广播到除接收到 MAC 帧端口的所有端口。 途径路由器的话,路由器是三层设备,会拆开 MAC 包,根据 IP 头部的目的 IP 查询路由表,判断转发目标,然后重新封装新的 MAC 包发送。 最终到达服务器后,开始按找打包顺序的逆顺序,一层一层解包:MAC 包->IP 包->TCP 包->HTTP 数据,拿到数据后,根据请求生成对应的回复信息,然后重新经历封包过程发送给客户端。 当客户端要离开时,向服务器发起 TCP 的四次挥手,断开连接。 HTTP 协议 基本概念 HTTP(HyperText Transfer Protocol)超文本传输协议。...
简介 本文尝试从零训练一个大模型,以学习大模型相关的训练流程和知识。 前置知识 RMS Norm 为什么要有 Norm? 规范化(Norm)本质是将非标准数据统一为指定格式的过程,个人理解是将数据重新映射到某个区间内。 这么做的一个原因是,随着网络深度的增加,各层的特征值会逐渐趋近激活函数的上下限附近,导致激活函数饱和,进而导致梯度消失。归一化(规范化)可以使特征值的分布重新回到激活函数对输入敏感的部分,从而避免梯度消失、加快收敛速度。 对训练数据和测试数据进行规范化可以防止不同数据分布对模型训练的影响,提高模型的泛化能力。 Batch Norm 和 Layer Norm 此处参考李沐 Transformer 视频:【Transformer 论文逐段精读【论文精读】】精准空降到 26:05 Batch Norm 是对一个 batch 内的数据按特征进行规范化: Layer Norm 则是对一个样本内所有特征进行规范化: 在图中可以直观看到,对于文本生成任务,Batch Norm 当不同 Batch 间的序列长度差异较大时,Batch Norm 由于空白的存在,导致算出的均值和方差波动较大。Batch Norm 在训练时使用当前 Batch 的均值和方差,在推理时使用整个训练集的均值和方差。 在推理时当一个 Batch 内有一个过长的序列,我们之前训练得到的均值和方差可能就不能很好的应用在这个没见过的长序列上,导致预测效果不好。而 Layer Norm 由于是每个样本内部做 Norm 相对来说没有这些问题,能够更好的应用在序列生成任务上。 Batch Norm 在计算机视觉领域更加有效,因为它消除了不同特征之间的大小关系,保留了不同样本间的大小关系。对于文本生成任务,Layer Norm 更加有效,因为单个样本的不同特征是词语随时间的变化,而且样本内的特征关系非常密切,它能保留样本内特征的大小关系,并且和它的计算和 batch 无关,能更好的应用在序列生成任务上。 为什么要有 RMS Norm? RMS Norm 提出的动机是 LayerNorm 的运算量比较大,因此对 LayerNorm 做了运算上的简化。 原有的 LayerNorm 计算公式: 计算均值$\mu$和方差$\sigma^2$: 对每个元素进行归一化: 对归一化后的结果进行缩放和平移,$\gamma$和$\beta$是可学习的参数: RMS Norm 的计算公式: 对于输入向量$x=(x_1,x_2,…,x_d)$,计算其均方根(RMS):...
简介 自从我全面迁移到 archlinux,目前手里已经没有 windows 的设备。在日常使用中,我有遇到了两个痛点: 腾讯会议共享屏幕的方案不够完美 之前在未接触 linux 时,充值了 2600h 的游戏加速时长,目前还有 1900h,在 linux 下无法使用 对于前者,除非腾讯重构腾讯会议,不然没有好的办法,而且工作时一般没有权力来决定不用腾讯会议(。而对于后者,我在网上搜寻了许多资料,一种可行的方案是跑一个 windows 虚拟机,在里面运行游戏加速器,然后代理主机的流量。但是 windiows 虚拟机还是太重了,我想寻求一种更轻量的方案。 探索 我在网上进行了大量的检索,先是发现雷神加速器有 openwrt 插件,并且有网友使用的是 openwrt 虚拟机桥接到局域网来代理流量,可以正常的工作。其实到这里也足够了,openwrt 虚拟机相比 windows 虚拟机,占用资源已经很小了。但是本着折腾的原则,我想在 docker 里跑 openwrt 来代理本机的流量。 如果不想折腾,你应该: 首先尝试购买一个软路由,在里面运行雷神加速器插件。 安装一个 openwrt 虚拟机,桥接网络的情况下代理本机。 最后再尝试使用 docker 运行 openwrt 来跑雷神加速器。 关于这个方案的优缺点,优点是省钱,缺点是折腾且不适用于笔记本电脑。因为 docker 里要配置静态 ip。个人感觉这个方案更适合不来回搬动的台式机。 在跟着本记录做之前,你应该: 对 docker 的使用有一定的了解 对局域网、Nat、桥接有一定的了解 对 openwrt 有一定了解 (虽然现学也行 安装 首先是找到一个 openwrt 镜像,我个人懒得自己做,用的是这个openwrt-x86。 里面有如何使用 docker 安装的教程,我详细说明一下: # 拉取镜像 docker pull piaoyizy/openwrt-x86:latest # 此处的eth0应该为你使用的网卡,可以用ip a查看 sudo ip link set eth0 promisc on # 此处创建一个macvlan的网络,其子网是当前物理机 # 局域网所在的网络,如“192....
日常中使用经常连接服务器,有的时候还需要使用跳板机和端口转发,于是简单记录一下自己使用 ssh 的经验。 基础配置 ssh 的默认配置文件在 Home 目录下的 .ssh 文件夹中,使用ssh-keygen -C "<描述内容>"会在这个文件夹中生成id_rsa和id_rsa.pub文件。如果是复制过来的密钥和公钥文件,需要确保其权限为仅当前用户可读可写(chmod 600),如果其他用户有读写权限则使用 ssh 连接服务器时会报错。将公钥复制到要连接的服务器的指定用户的~/.ssh文件夹下的authorized_keys文件中,就可以免密登录。 如果需要关闭服务器的密码登录权限,则需要在/etc/ssh/sshd_config中设置PasswordAuthentication no禁用密码登录。 注意:你应该先把公钥复制到 authorized_keys 中,并且测试过了可以免密登录,再禁用密码登录。 命令行使用 常用的命令行命令有: # 连接到指定服务器,username是登录用户名, # hostname可以是域名和IP,可以使用-p指定端口,默认为22 ssh username@hostname # 在本机指定端口开启代理,相当于一个socks代理 ssh -TND <端口> username@hostname # 发送到指定端口的数据都会经过hostname # 所在的服务器转发到指定远程主机的对应端口 ssh -TNL <本地端口>:<远程主机ip>:<远程端口> username@hostname # 例子,发送到本地8001端口的数据都会经过10.10.10.10转发,发送到10.10.10.10所在网络环境下的192.168.0.3:80 ssh -TNL 8001:192.168.0.3:8006 username@10.10.10.10 # 使用跳板机 # 假设你在host1 ... hostn都配置了公钥免密登录,你可以经过host1 跳转到 host2 ... 链式跳转连接到 hostn ssh -J user1@host1 user2@host2 ... usern@hostn 使用 ssh 配置文件 配置文件是.ssh文件夹内的config文件,下面是一个例子: # 在命令行使用ssh jump相当于 # 使用ssh user1@10....
简介 本篇记录一下自己使用的多线程下载器方案,由于我日常使用的操作系统是 Archlinux,因此是 linux 下的配置,windows 下使用需要进行修改,并且可能有其他更好的方案。 Aria2是一个多线程下载器,它支持 HTTP(s),FTP,STP,BitTorrent 等协议的下载,基本上安装它一个就足以应付日常的所有下载需求了,这也是我选择它的原因。由于我没有离线下载的需求,因此本篇文章并不会涉及相关内容,本篇更关注如何使日常使用 aria2 更舒适方便。 安装 在 Archlinux 上安装 aria2: paru -S aria2 安装好后,aria2 需要进行一些配置才适合使用,我使用的是“Aria2 完美配置”这个项目。 # 将其clone到~/.config/aria2 git clone https://github.com/P3TERX/aria2.conf.git ~/.aria2 克隆下来的 aria2.conf 需要进行一些修改,按自己需要修改,需要注意的是,aira2 的配置文件不支持~为 Home 目录,需要将下面示例的~替换为绝对路径: # 下载目录。可使用绝对路径或相对路径, 默认: 当前启动位置 dir=~/Downloads # 从会话文件中读取下载任务 input-file=~/.aria2/aria2.session # 会话文件保存路径 # Aria2 退出时或指定的时间间隔会保存`错误/未完成`的下载任务到会话文件 save-session=~/.aria2/aria2.session # IPv4 DHT 文件路径,默认:$HOME/.aria2/dht.dat dht-file-path=~/.aria2/dht.dat # IPv6 DHT 文件路径,默认:$HOME/.aria2/dht6.dat dht-file-path6=~/.aria2/dht6.dat # 下载停止后执行的命令 # 从 正在下载 到 删除、错误、完成 时触发。暂停被标记为未开始下载,故与此项无关。 on-download-stop=~/.aria2/delete.sh # 下载完成后执行的命令 # 此项未定义则执行 下载停止后执行的命令 (on-download-stop) on-download-complete=~/....
一、简介 这篇文章主要记录搭建博客以及其他网站时用到的一些内容,包括: 获取域名 配置 Cloudfla DNS 解析 配置 Https 可能的 Nginx 配置 二、获取域名 学生获取域名可以前往Github 教育认证,完成教育认证后可以在教育优惠包中找到".TECH domain free for 1 year",可以在里面领取为期一年的免费域名。 DNS 域名解析 Cloudflare提供了免费的 DNS 解析服务和代理服务。免费计划的代理印象比较深的一个限制是单个文件上传大小限制在 100MB,如果要搭建Alist网盘服务的话,可能要注意关闭 Cloudflare 的代理,让其只解析 DNS。 配置 HTTPS 搭建网站一般都需要配置 HTTPS,但是大部分 HTTPS 证书的申请都需要付费,自签名的证书又没有 CA 认证,会有一些问题。白嫖的方案是使用Let's EnCrypt,提供免费的 ssl 证书,而且也是被认证的,不会有签名问题。它使用一个名为 Cerbot 的客户端来访问,可以访问Cerbot 官网查看,linux 下可以使用pip或snap安装命令行客户端,具体参见官方教程 Nginx 配置 Nginx 新建一个网站配置,可以在/etc/nginx/conf.d/路径下新建一个<filename>.conf的文件,文件可以按自己喜好命名。下面是一个样例的配置 # /etc/niginx/conf.d/web.conf server { # 设置nginx https监听的端口为443 listen 443 ssl; # 设置域名,your.domain.com应该是你的网站 server_name your.domain.com; # 证书文件路径 ssl_certificate /path/to/your/certificate; # 证书私钥文件路径 ssl_certificate_key /path/to/yout/privatekey; # ssl验证配置 ssl_session_timeout 5m; # 安全链接可选加密协议 ssl_protocols TLSv1 TLSv1....
参考连接 本文内容参考:Ceph 官网 官网推荐的安装方式是使用cephadm 如果要将 Ceph 与 Kubernetes 集成,官网推荐使用Rook 一、普通安装方式(非 K8s 集群) 1. 前置要求 系统推荐: 官方目前推荐使用 Ubuntu 20.04 系统内软件需求: Python3 Systemd Podman or Docker (用于运行容器) 安装 docker 请参考官网教程,若遇到网络问题,请参考官网的手动安装教程。 时间同步(如 chrony) lvm2(提供存储) openssh # 查看是否安装相应的软件 # python version python3 --version # systemd version systemctl --version # docker version, 安装教程请参考docker官网 docker version # chrony version, 安装使用"sudo apt install chrony"命令 chronyc -v sudo systemctl status chronyd.service # 查看chrony的service # lvm2 dpkg -l | grep lvm2 # 查看是否安装lvm2 # 若没有安装则安装 sudo apt update && sudo apt install -y lvm2 # cephadm 基于发行版的安装方法 sudo apt install -y cephadm # 检查是否安装成功 sudo which cephadm 2....
前言 这是我个人搭建博客的一个记录,主要作用是记录自己的搭建过程留作备份,或许有一定的参考价值,但请根据使用组建的官方连接获取最新消息,以防文章过期。 一、 整体架构 使用Markdown编写博客文章。 使用Hugo 将Markdown 文章转换为HTML 网页代码。 使用PaperMod 作为Hugo 的网页主题,提供美观的界面。 使用Disqus 基于Github Discuss 提供评论功能。 利用Github Pages 部署和访问博客(Github提供的 github.io 域名)。 利用Github Actions 达成自动推送Markdown 到仓库,便会更新网站。 二、效果 如前所述,配置好后就可以专注于使用Markdown写文章,当写好文章使用git push 推送到Github仓库后,Github Actions 就会自动更新博客。 而且由于使用Github Pages 访问博客(如我的博客是: suiyuanla.github.io),并没有实际使用服务器与购买域名,可以实现零成本部署博客。 当然,由于github.io 域名并不稳定,实际上可能需要自行购买域名。当然,如果你是学生的话,Github Education 教育优惠也提供免费域名,请自行挖掘。 三、搭建过程 安装Hugo Hugo:世界上最快的网站构建框架。(官网自述): # 我使用arch linux 以及paru aur helper paru -S hugo # 安装hugo 本机部署Hugo 的一个原因是,初始化项目以及新建文章和本地编辑预览需要使用。 创建项目 此处应首先选择一个Hugo 主题,查看主题是否需要特殊的创建选项。 我选用的是PaperMod,去年第一次搭建博客的时候它并不是Hugo 官网主题的第一个,但现在已经放到HUgo官网主题的第一个了。(笑,并不是我随大流,但是确实好用) Hugo的 config文件支持yaml、toml等格式,而且默认使用toml格式。但是PaperMod主题提供的是yaml,因此创建网站时要指定使用yaml格式: # 参考:https://github.com/adityatelange/hugo-PaperMod/wiki/Installation # 我的网站使用suiyuan-blog,可自行替换 hugo new site suiyuan-blog --format yaml # 使用tree查看创建好的目录结构(非必做) tree suiyuan-blog suiyuan-blog ├── archetypes # 存放模板 ├── assets ├── content # 文件下的posts文件夹存放博客内容 ├── data ├── hugo....
安装 archlinux 基本环境 参考: Arch Wiki 如何安装 ...