背景: 我一边在用 smb 协议传输文件,一边在打 csgo,我发现网络延迟很大,50~100ms,关闭正在传输的任务就好了。
什么是 smb 协议?
SMB(Server Message Block,服务器消息块协议)是一种应用层网络文件共享协议,主要用于在局域网内实现文件、打印机、串行端口等资源的共享访问。它允许客户端计算机像访问本地文件一样访问服务器上的共享资源。
常见应用场景:
- Windows文件共享:Windows系统间文件共享的标准协议;
- NAS设备访问:群晖、威联通等NAS设备通过SMB提供文件服务;
- 跨平台共享:macOS、Linux(通过Samba软件)可访问Windows共享;
- 企业文件服务器:集中存储和管理企业文件资源。
为什么游戏会卡顿?
核心原因是网络带宽和系统资源被抢占,SMB协议在传输大文件时,会尽可能占用所有可用带宽(TCP的拥塞控制机制导致),而网络游戏对延迟极其敏感(通常要求<50ms)。当SMB占满带宽时,游戏数据包需要排队等待,造成延迟抖动和丢包,导致游戏卡顿、掉线。
SMB传输会大量消耗CPU、内存和磁盘I/O资源:
- CPU占用:SMB协议加密/解密、压缩处理需要CPU计算;
- 内存压力:文件缓存机制占用大量内存;
- 磁盘读写:同时读写文件会降低系统响应速度;
- 游戏本身也需要这些资源来渲染画面、处理网络数据,资源竞争导致游戏帧率下降。
解决方案
- 限速SMB传输:在文件传输软件中设置带宽限制(如设置为总带宽的50-70%);
- 使用QoS功能:路由器支持QoS时,优先游戏数据包;
- 错峰传输:游戏时暂停文件传输 √
- 升级网络设备:千兆网卡、高性能路由器可缓解资源竞争;
- 检查网络配置:确保网卡驱动、MTU设置等优化。
网络传输是CPU密集型任务吗?
对于普通文件传输(无加密/压缩),千兆网络下CPU占用通常<10%,属于I/O密集型或网络密集型任务。只有当启用加密、压缩或处理大量小文件时,才可能转为CPU密集型。
网络传输的核心瓶颈通常是网络带宽和磁盘I/O,而非CPU。数据包在网卡和内核协议栈之间的处理由硬件和操作系统优化,现代CPU处理网络协议栈的开销很小。但在以下场景会显著消耗CPU:
- SMB加密传输
- 数据压缩/解压
- 高并发小文件传输
- 软件RAID/网络存储
- 虚拟化环境