网络库之Netpoll与Poller的调度设计与优化  [draft]

文章施工中 - 2022-03-02

March 2, 2022 · 1 min · Sxueck

TCP拥塞控制算法BBR的原理和改进实践  [draft]

建议就着咖啡观看,避免干着 实验环境 操作系统:Debian 10 Linux Kernel:5.10.x 前言 我在编写之前的文章《服务器性能优化之网络性能优化》中,其实有想把 BBR 作为一种优化手段写进去的,然而受限于篇幅不能过多讲解,因此特地单独细致地研究一遍。 通常我们在研究 BBR 算法的时候,会很难不将其与 Cublic 算法做比较,作为 Linux 内核默认的 TCP 拥塞控制算法,我们在这里也将会一并列入对比和实验中。 基本的概念 盖房先建地基,对应的学习一门知识也要先掌握与巩固前置基础,这里先将几个较为关键和频繁出现的知识要点来回顾一下,但在这里我将默认你已经掌握了基本的网络技术(例如滑动窗口,重传定时器等概念),否则你更需要的可能是一本网络入门书。 拥塞控制四板斧 由于 TCP 协议向应用层提供不定长的字节流发送方法,使得 TCP 协议先天性地有意愿去占满网络中的整个带宽,这时候当网络中许多连接同时试图去占满整个带宽的时候,就有可能发生恶性拥塞事件,因此 TCP 拥塞控制算法的作用,它能有效防止过多的数据注入到网络中,导致出现网络负载过大的情况。当 TCP 拥塞控制算法无法满足当前互联网应用对网络传输高实时性、高带宽利用率、高吞吐量的需求,在这种背景下 BBR 应运而生。 注意它和流量控制的区别,流量控制更多是作用于接收者,它控制发送者的发送速度从而使接收者来得及接收,防止数据分组丢失 在我们逐步分析对应控制手段之前,需要先行假设: 数据是单方向传递,另一个窗口只发送确认 接收方的缓存足够大,因此发送方的窗口大小由网络的拥塞程度来决定 慢启动 概念 我们都有过从互联网下载东西的经历,通常来说,文件的下载速率并不是一开始就达到到你的宽带上限,而是逐步从例如 1MB/s → 4MB/s 递增上去,这其实就是我们能看见的一种很典型的慢启动策略。 在这场下载中,发送方(即内容提供服务器)会维持一个叫做拥塞窗口 cwnd 的状态变量。它用来表示发送方在得到接收方确认前,最大允许传输的未经确认的窗口。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。 这时候我们又要引入两个新的词,即 通告窗口 rwnd 发送窗口 swnd = min(cwnd, rwnd) 虽然是新的词,但概念大体是新瓶装老酒,通告窗口就是我们 TCP 报文头的 Window 字段,也就是对方的接收窗口,例如我这里截了一张随手抓的报文内容,这里的 rwnd 就为 1021 而发送窗口的概念就更简单了,它将 rwnd 与 cwnd 做比较,取两者最小值,如果我们将整条连接堪称一个水桶,那么它代表水桶中最短的那块木板,而 cwnd 与 rwnd 相比不同的是:它只是发送方的一个内部记数,无需通知给接收方,其初始值往往会比较小,然后随着报文被接收方确认,窗口成倍扩大,有点类似拳击比赛,开始时候不了解对方情况只能先行试探,后来心里有底了逐渐加大进攻力度。...

March 2, 2022 · 21 min · Sxueck

使用Lua编写插件加强Nginx - 初探

虽然说 Nginx 的标准模块非常强大,然而如果遇到了一些不能灵活适应系统要求的功能时候,我们往往会考虑使用 Lua 拓展和定制 Nginx 服务,目前对于这种需要拓展性的项目一般采用 OpenResty ,按照官方的介绍,OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web 应用、Web 服务和动态网关 但是,有的时候服务已经部署完成,包括配置都已经写好了,直接对线上的 Nginx 进行替换显然是一种非常冒险与费神的行为,又或者是只需要某一项功能的拓展,并不需要整体做大改动,这个时候用 Lua 模块就是一种很好的选择。 模拟线上环境 这里我启用了虚拟机作为线上的机器,因此需要重新安装 Nginx,Arguments 这边是需要单独记下来的,和后面编译做到尽量一个参数,这样对配置文件不会造成任何影响 $ sudo add-apt-repository ppa:nginx/stable $ sudo apt-get update $ sudo apt install nginx $ nginx -V nginx version: nginx/1.18.0 (Ubuntu) built with OpenSSL 1.1.1f 31 Mar 2020 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-d4S6DH/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx....

February 23, 2022 · 3 min · Sxueck

从GoProxy中学习反向代理

阅读目的 弄清楚项目是如何完成代理的功能,因此重点弄懂 Proxy 部分的代码 项目地址 https://github.com/goproxyio/goproxy 从项目启动开始,我们的重点就是下面的这个参数 flag.StringVar(&proxyHost, "proxy", "", "next hop proxy for Go Modules, recommend use https://gopropxy.io") 我们将这个参数设置为国内可以访问的 https://goproxy.cn ,并且尝试一下是否能跑通整个服务,这里使用的是 Powershell,换成 Linux Shell 的时候其实也是一样的流程 # 单独开启一个终端启动服务 $ $CacheDIR = "G:\\GomodDebug" $ mkdir -p $CacheDIR\pkg\mod\cache\download\github.com\goproxyio\goproxy\@v\ $ go run . -proxy https://goproxy.cn -listen 127.0.0.1:8085 -cacheDir $CacheDIR goproxy.io: ProxyHost https://goproxy.cn goproxy.io: ------ --- /github.com/@v/list [proxy] goproxy.io: ------ --- /github.com/goproxyio/goproxy/@v/list [proxy] goproxy.io: ------ --- /github.com/goproxyio/@v/list [proxy] goproxy.io: 0.344s 404 /github.com/@v/list goproxy.io: 0.548s 200 /github....

February 11, 2022 · 4 min · Sxueck

如何编写一款网络代理服务  [draft]

本篇文章仅供技术交流,请遵循相关国家法律法规,作者不提供任何技术支持 没啥思路,文章暂时搁置 - 2022-03-02 前言 Socks5 协议 在编写相关代码之前,我们需要先将 Socks5 协议给了解一下 使用 WireShark 抓取 Socks5 报文 $ curl --socks5 157.90.140.29:1080 ip.sb 同时我也将 WireShark 抓取到的报文片段截取下来了,可以点击 下载 后,使用相同的软件进行本地分析 分析Go-Shadowsocks2的源码 tcp.go // Create a SOCKS server listening on addr and proxy to server. func socksLocal(addr, server string, shadow func(net.Conn) net.Conn) { logf("SOCKS proxy %s <-> %s", addr, server) tcpLocal(addr, server, shadow, func(c net.Conn) (socks.Addr, error) { return socks.Handshake(c) }) } // Create a TCP tunnel from addr to target via server....

January 24, 2022 · 2 min · Sxueck

经验杂谈

这里汇集了平常学习和工作中遇到的一些小小的疑难杂症 Linux Service Nginx xxx.so is not binary compatible in /etc/nginx/nginx.conf 这个通常发生在编译 Nginx 模块后,我们通过 load_module 加载该模块发出的报错,针对这种的解决方案也很简单,加上 --with-compat 即可,例如 ./configure --with-http_image_filter_module=dynamic --with-compat Kubernetes 如何更新 Terminating 状态的命名空间? 但是在某些情况下,调用删除 Namespace 的指令后,Namespace 一直处于 Terminating 状态 查看命名空间详情 $ kubectl get ns -o yaml -n longhorn-system ... instances, nodes.longhorn.io has 1 resource instances' reason: SomeResourcesRemain status: "True" type: NamespaceContentRemaining - lastTransitionTime: "2022-03-29T01:40:54Z" message: 'Some content in the namespace has finalizers remaining: longhorn.io in 2 resource instances' reason: SomeFinalizersRemain status: "True" type: NamespaceFinalizersRemaining phase: Terminating kind: List metadata: resourceVersion: "" selfLink: "" 查看并删除该命名空间下的资源 $ kubectl api-resources -o name --verbs=list --namespaced | xargs -n 1 kubectl get --show-kind --ignore-not-found -n longhorn-system NAME STATE IMAGE REFCOUNT BUILDDATE AGE engineimage....

January 24, 2022 · 1 min · Sxueck

服务器性能优化之网络性能优化(二)  [draft]

这是接文章《服务器性能优化之网络性能优化》的续篇,因为里面包含了代码导致篇幅过长,不方便阅读和索引,接下来的优化思路将会在这篇文章继续学习

January 23, 2022 · 1 min · Sxueck