本文最后更新于 2024-10-05,文章内容可能已经过时。

本文心得来自bilibili视频

一、这位Up主先是使用了bbrplus替代了cubic

Cubic(立方)时间复杂度通常表示为 O(n3)O(n^3)O(n3),意味着算法的执行时间与输入规模 nnn 的立方成正比。也就是说,当输入的规模增加时,算法的运行时间会按 n3n^3n3 的速率增长。

典型具有 O(n3)O(n^3)O(n3) 时间复杂度的算法包括三重嵌套循环操作。一个例子是:

  • 矩阵乘法:在朴素矩阵乘法算法中,两个 n×nn \times nn×n 矩阵相乘时,每个元素的计算都涉及一个内积,需要 O(n)O(n)O(n) 次乘法操作。整个计算过程涉及 n2n^2n2 个元素,因此总时间复杂度为 O(n3)O(n^3)O(n3)。

这种复杂度在处理较大规模的输入时表现出非常高的计算开销,因此通常需要优化或寻找更高效的算法。

BBR(Bottleneck Bandwidth and Round-trip propagation time)是一种拥塞控制算法,主要用于提高网络传输的效率。BBR 通过估算网络的带宽和延迟来调整发送速率,以避免传统拥塞控制算法中的拥塞窗口限制问题。

BBR 算法的时间复杂度通常无法用传统算法时间复杂度的方式(如 O(n)O(n)O(n)、O(n2)O(n^2)O(n2) 等)直接衡量,因为它是一个运行在网络传输环境中的算法,其性能更多地依赖于网络状况(如带宽、延迟、丢包率等)而不是输入规模的增长。

然而,从计算角度来看,BBR 的复杂度主要体现在以下几个方面:

  1. 带宽估算和 RTT 计算:BBR 通过监控往返时延(RTT)和带宽来估算网络状态。这些估算过程需要基于时间采样和历史数据进行,因此其计算过程相对轻量,接近常数时间复杂度 O(1)O(1)O(1)。
  2. 控制器调整:BBR 的关键在于调整发送速率,它会定期更新发送窗口大小和进行带宽探测。这些操作大多是基于当前的估算结果进行判断和调整,并不会随着数据包的数量呈现指数级增长,因而在每个 RTT 周期内的复杂度依然是 O(1)O(1)O(1)。

综上所述,BBR 算法的核心操作大多是定期的估算与调整,计算复杂度接近常数时间 O(1)O(1)O(1)。但是其实际运行性能更多地依赖于网络条件(如带宽和延迟),而不是算法输入规模的增长,因此不适用传统的时间复杂度度量。

二、Up主的机子是6M腾讯云 入向防护是2G 峰值抗4000Qps 所以选择nginx的Qos

重启电脑 关闭没必要的服务器 nginx (nginx的Qos)默认是使用的漏桶算法 博主给他(单ip限制每秒5Qps 突发设置100 延迟200) (假如打开一个网站 前100个请求马上响应 超过100个就排队 排队的队列长度是200 (200以内每秒放行5个) 超过队列长度直接444 就不) 并发链接设置40个 带宽限制100K/s 突发设置1M (博主内心tips:nginx的带宽限速有问题 不能针对单个ip限速 只能针对单个连接限速 要是客户下载客户端刷流量怎么办) 给客户端限速下载 并发数只能限制2 要是头1M下载 后面的流量按100K 对于薄弱环节的登录接口 为了防止暴力破解只能限速 每秒1Qps 设置较大的burst(害怕影响正常用户) 顺便把reverse proxy拉白 超速返回444(503 429响应太大 会把带宽打爆)

如果你面对的是200G带宽5000万Qps 那么你可能需要P4交换机甚至网卡卸载来清洗流量如果有必要的话还需要运营商下发一个黑洞路由

如果你面对的是30G的流量800万Qps 那么你需要DPK来帮你清洗流量

如果你面对的20G流量 500万Qps 那么你可以用XDP来帮你清洗流量

如果你面对的是10G流量 100万Qps 那么你只需要netfilter清洗流量 简单配置iptables即可

如果流量过大 配置dns负载均衡 用多台服务器分摊流量

以下是Up主的笔记

...

http {
    ...
    # 添加IP白名单
    geo $limit {
        default 1;
        192.168.0.0/24 0;
        10.0.0.0/8 0;
        127.0.0.0/8 0;
        43.132.198.237/32 0;
    }
    # 匹配白名单不限速,否则限速,limit_key做匹配的key
    map $limit $limit_key {
        0 "";
        1 $binary_remote_addr;
    }
    # 限制请求数,漏桶算法,每秒放行5个,超过的会排队
    limit_req_zone $limit_key zone=req_ip:10m rate=5r/s;
    # 超限返回444,直接断开链接,不响应任何内容
    limit_req_status 444;
    #限制连接数
    limit_conn_zone $limit_key zone=con_ip:10m;

    server {
        ...
        # 限制下载速度100kBps每秒
        limit_rate 100k;
        # 限制下载burst为1M,前1M不限速,后面限速
        limit_rate_after 1m;
        # 限制并发连接为1
        limit_conn con_ip 40;
  
        location / {
        # 两段限速,前100个不限速,后200个限速,限制5个/秒,超过断开链接
        ...
        }
  
        location /public/pkg/ {
            # 限制下载并发为2,防止刷流量
            limit_conn con_ip 2;
            limit_req zone=req_ip burst=10;
        }
    }
}