分布式思考:批发Batch是个好东西,用足它
你家是大户,你有辆五座小轿车,过年了,你要到火车站去接来访的亲戚。如果来了小妹,你可以马上接她,让她快点到家早点休息。但你付出的代价cost是时间和汽油费。你也可以稍微等一下,因为下趟车的舅妈一个小时候后就到,你可以两个人一起接上,的麻烦可能是小妹会埋怨你几句,让她干等1个小时(Latency变长了),但trade off是你省了路上的两趟时间和两次汽油。
但是,如果某一趟来了一大家人,你的叔叔家共三人,你肯定不会分三次,每次只在车中放一个乘客。否则,你就是个大傻子。
计算机世界里,也是同样的道理。
这个优化,我们叫做Batch。
## 磁盘上的Batch
在Throughput, Bandwidth, Latency里,我有个测试,对磁盘做同样的写,只是block size不同,一个是4K,一个是1024K,磁盘的Throughput差别竟然大到超过60倍。
这就是Batch的力量。因为如果是4K一次提交,磁盘这个轿车,就只能载4K这样一个人。而1024K一次提交,磁盘这个轿车就可以满载而归。
## 网络上的Batch
网络上同样存在Batch现象。
对于TCP/IP,一个数据包package,如果跑在底层Ethernet协议上,大可以到1500字节。但如果你只发送一个字节一个包,TCP/IP也得像上面的小轿车一样去跑,而且还得在里面加上40字节的head信息(TCP用20字节、IP用20字节),这相当于上面的汽油。
所以,TCP/IP里有[Nagle算法],专门对这个进行优化。
## 操作系统和应用软件的Batch
比如:RocksDB就提供Batch的专门接口:
对于写,有[WriteBatch]
对于读,有[MultiGet]
Redis也用到了,可以参考[Redis Pipeline]
Kafka用得更多,比如:
1. IO上的Batch,参考[Kafka Efficiency]
2. [Batch Compression]
3. [RdlibKafka High Performance]
## 一些常规代码里也经常用到Batch
比如:我们有一个动态数组(假设是整型),传入应该是空的,我们需要初始化连续的数字(从零开始)
C++
void init_continuouse_nums(const int count, std::vector<int>& nums)
{
assert(count > && nums.size() == );
for (int i = ; i < count; ++i)
{
nums.push_back(i);
}
}
相关文章