2021年10月11日星期一

IO性能相关

 SSD性能

  1. 固态硬盘有逻辑地址和物理地址的关联系统,所以不管顺序或者随机写都没有寻址时间,都是顺序写入nand。反复更新热点数据nand也会被均匀消耗。
  2. 没有读改写的过程,写入都是先将数据写入新的物理地址,再将原来的地址标为无效。
  3. ssd已经写入过数据的块需要擦除才能再次写入,类似gc的过程。随机写的数据擦除难度要大于顺序写。
  4. 队列深度,端口队列中等待服务的I/O请求数量,有点类似于网络服务中的缓存队列。队列深度和多线程还是有区别,单线程的时候,即使队列深度大于1,但每个访问请求的寻址和传输都是串行的,也就是必须先寻址然后才能传输。而多线程的时候,不同线程的这两步是可以并行的。
  5. ssd的顺序访问的定义,如果 I/O 操作开始的逻辑块地址(LBA)直接跟着前一个 I/O 操作的最后LBA,则称值为顺序访问
  6. 即使ssd随机访问也比顺序访问慢。原因是随机读不能利用预读功能提前缓存数据,每次 IO 需要重新定位物理地址,随机写造成大量磁盘碎片,极大地增加了垃圾回收的压力,小数据量的随机写无法利用 SSD 内置的并发能力
  7. ssd多线程随机读性能很好,某些时候甚至接近顺序读,因为ssd芯片本来就支持并发处理,顺序读的提前预测地址的能力相当于被多线程同时传入多个地址实现了。多线程随机写在磁盘充足的情况下也是同理,但是一旦gc性能就下来了,所以控制磁盘使用量也是一种优化手段。


参考链接 

写放大

不能原地更新只能先擦除再写入,写入是页为单位擦除只能块(很多页)为单位,如果一个块上面部分是有效数据部分要擦除只能把有效数据挪到其它块然后整块擦除,写放大就出来了。擦除过程类似GC,空余空间越多越容易腾挪,写放大就相对较小,所以不要把SSD写太满。

高延迟网络优化

TCP BBR

  1. 基于tcp的拥塞控制算法,在4.9以上的linux直接通过参数配置就可以使用
  2. 传统拥塞算法会不断增加窗口直到把带宽占满buffer占满直到丢包,丢包之后又会迅速降低发送速率。导致两个问题,高延迟网络往往丢包率高-不仅仅是buffer占满的丢包所以经常降低发送窗口导致低带宽利用。需要占满带宽和buffer来探测带宽导致高延迟。
  3. bbr解决方案关键点在于不用丢包判断带宽而是直接通过确认包来判断,慢启动发现带宽不再增加后不会进入占满buffer阶段。
  4. 网络链路上能容纳的数据包数量 = 链路带宽 × 往返延迟,所以还需要探测延迟,而buffer较满的时候延迟会有偏差,所以bbr会定时有低频率发包估算延迟的阶段。
参考链接

KCP

  1. 通常基于udp,实现了tcp的可靠传输,顺序,流控等等
  2. 选择性重传而不是tcp的全部重传,快速重传而不是等超时,立即ack而不是延时ack,非退让流控可以直接占满带宽,这几个是快的原因。如果丢包率高,重传应该对整体速度影响较大,快重传很有意义。
  3. 缺点是两端要安装额外的客户端,有额外的10%-20%的带宽浪费,另外主要应用好像在游戏,视频领域
参考链接