Unix Like, 操作系统

千兆公网带宽的TCP sendbuffer与receivebuffer调整

不知道有多少人留意过,使用千兆公网带宽传输数据时,只要距离稍微远点,就无法跑满千兆。对于这种情况,可能第一反应是“线路繁忙,公网带宽不足,跑不满很正常”。不过如果你有在不同地区的多台千兆设备间传数据的经历的话,你大概会发现,最大传输速度跟延迟成负相关。 首先丢出个公式:

TCP有ARQ机制,已发出的数据要收到ACK后才能丢弃。因为至少要等一个RTT才能收到ACK,所以sendbuffer要至少能存放一个RTT内能发出的数据量。另外,TCP的拥塞控制也会根据接收方的receivebuffer大小限制数据的发出速率。因此,如果想达到 […]

Read more
Unix Like, 操作系统, 网络

Linux IPv4 forward自动丢弃源IP为系统已绑定的IP的问题

A是路由,其上做了策略,一部分符合特定条件的流量,是要转发到B进行封装处理,A和B之间做了数个VLAN,B根据VLAN应用不同的策略。 不过这里的问题是,B的默认网关也是A(环路问题是不存在的,已经有对应规则处理),所以B自身发出的流量也会由A应用策略,转发回给B自己。而B收到src IP是local IP(系统已绑定的IP)的包时,kernel会直接丢弃数据包,所以除了B自己的数据包,B都能正常封装。 解决这个问题的一个方法,是让A在把数据包转发给B前,做一次SNAT,这样B收到的数据包,src IP就是A的IP了。其实SNAT并没有什么影响,A对NAT也有hardware offload, […]

Read more
Unix Like, VPN, 网络

TCP Sendbuffer Size与RTT的问题

最近从A服务器下载数据时,发现如果走B服务器的VPN下载,速率只能跑到300KB左右,但是B从A直接下载却能跑到1MB+/s,B到本地的速度也远超过A到B的速度,其实一开始我以为是VPN实现的问题,有段时间在思考如何优化VPN,但是尝试了其它VPN实现,问题并没有解决。后来发现,走B的代理而不是VPN,速度正常。 本地到B的RTT大约160ms,B到A大约50ms。 Wireshark抓包,对tcp sequence number统计了下: 放大点看: 大概每传输60KB,就要等大约200ms才能继续。200ms刚好差不多等于本地走VPN到A的RTT。传这60KB,只花了大概10ms,忽略这1 […]

Read more
Unix Like, 服务器

双路超线程物理服务器的QEMU CPU affinity调整

首先运行 virsh capabilities 查看物理机物理核心及其线程与逻辑处理器(线程)的关系:

其中的socket_id代表CPU的槽位,core_id代表CPU物理核心,siblings表示哪些逻辑处理器(线程)是属于同一个物理核心的。 例如id为0以及8的逻辑处理器,都属于同一个CPU槽位且属于同一个物理核心。 在这台物理机上建立的虚拟机,想得到最佳的性能,首先不要跨CPU插槽,其次,不要让多个虚拟机CPU共享同一个物理核心。 根据上面的信息,4核心8线程的虚拟机CPU亲和度配置如下: [crayon-6605bd8 […]

Read more
Unix Like

mdadm RAID1转RAID10

mdadm支持missing两个硬盘的情况下组RAID10,因此可以先通过两个新硬盘+两个missing组RAID10,然后把现有RAID1中的数据拷贝到新的RAID10中,再把现有RAID1中的两个分区加入到新的RAID10中,让mdadm自动重建数据。 下面假设现有的RAID1分区是/dev/sda5与/dev/sdb5,新的两个分区是/dev/sdc5与/dev/sdd5,最终目的是要使用/dev/sda5、/dev/sdb5、/dev/sdc5以级/dev/sdd5组RAID10。 首先备份数据。 如果操作的是系统分区,使用LiveCD操作即可。 [crayon-6605bd84704 […]

Read more