zStorage的尾延迟优化方案详解
zStorage的尾延迟优化方案详解
在分布式存储系统中,尾延迟(Tail Latency)是一个关键性能指标,它直接影响用户体验和系统稳定性。本文将介绍云和恩墨的zStorage系统如何通过优化策略降低尾延迟,提升系统性能。
背景介绍
分布式存储系统是一种将数据分散存储在多个服务器节点的多个硬盘上的存储方式,通过横向扩展(scale-out)构成一个巨大的存储资源池,以提高数据的安全性和访问速度。
存储系统的尾延迟指的是在一组IO请求中,延迟最高的一部分请求的延迟时间。例如,如果99%的IO请求的时延都小于某个时长Lat,那么这个时长Lat就是P99时延。尾延迟可以影响系统的稳定性、可预测性和用户满意度。
问题阐述
尾延迟的存在意味着虽然大多数请求能够迅速得到响应,但总有那么一小部分请求因各种原因(如网络延迟、服务器性能波动、硬盘响应慢等)而变得异常缓慢。在高并发场景下,这种情况尤为严重,足以导致整个应用响应迟缓,严重影响用户体验。
尽管zStorage处理一个IO请求只需要3-4个进程配合完成,但由于NVMe SSD和网络本身存在尾延迟问题,因此优化尾延迟对zStorage仍然非常重要。
解决方案
zStorage的工作机制
服务等级分类和请求优先队列
服务可以提供多个接口,并且这些接口可以根据它们的重要性被分配不同的优先级。这意味着,高优先级的接口会被优先处理,而那些优先级较低或对处理速度不敏感的接口则会排在后面执行。这种优先级设置确保了关键操作能够快速响应,同时对时间不敏感的任务不会阻塞紧急任务。
例如关系型数据库为了支持事务机制,通常使用写前日志(WAL),会有数据库日志写请求产生,那么就有不同等级的写请求产生。zStorage 是针对数据库场景的分布式存储系统,对这类场景有专门优化。
zStorage 可以区分写请求的优先级,提供两种不同识别优先级方式:
- 通过特定卷设置为高优先级卷,例如数据库将日志卷设置为高优先级卷。
- 支持智能识别数据库日志写请求,通过分析写请求,智能判断是否为高优先级写请求。
zStorage 提供请求优先队列,将高优先级的写请求放入优先队列,优先处理数据库日志写请求,并动态监控IO队列进行调整。
备份读请求
降低延迟波动的一个简单策略是同时向多个副本发送相同的请求,并采用最先返回的结果。一旦有结果返回,客户端就会取消所有其他未完成的请求。然而,这种直接的实现方式可能会导致负载增加几倍,因此需要进行优化。
在实现这个机制时,需要注意以下几点:
(1) 处理条件的判断:
- 收集 Leader 之前处理过的一定数量的读请求时延数据,计算 P95 时延,当读请求的时延超过 P95 时延时,Leader将读请求转发到 Follower。这样可以避免过于频繁地转发读请求,同时也能保证系统的性能。
- 这里选择 P95 时延而不是 P99 时延,是因为根据《The Tail at Scale》[CACM2013]中统计数据显示对于单个随机请求,其99分位数的延迟是10毫秒。然而,当考虑所有请求时,99分位数的延迟升至140毫秒,而95%的请求在99分位数的延迟为70毫秒。这表明,最慢的5%的请求贡献了总99分位数延迟的一半。因此针对这些慢请求进行优化,可以对整体时延有巨大影响。
- 收集与计算 P95 时延的过程需要一定的时间,因此需要合理地选择收集的数据量和计算的时间间隔,另外也需要选择合适的工业级算法,避免产生过多的计算开销和内存开销。这里给出一些常见的业界较为成熟的算法:
- Rocksdb使用的histogram算法(https://github.com/facebook/rocksdb/blob/main/monitoring/histogram.cc)
- folly/facebook使用的t-digest算法(https://github.com/facebook/folly/blob/main/folly/stats/TDigest.cpp)
(2) 选择合适的 Follower:
选择哪个 Follower 处理读请求是一个重要的问题。这需要根据 Follower 的当前负载、网络延迟等因素进行动态调整。
zStorage 是通过一些负载均衡算法,如轮询等等,来选择合适的 Follower。这些算法需要根据实际情况进行调整,以保证系统的性能。
(3) 降低网络开销与系统稳定:
虽然读请求的转发可以提高处理速度,但也会增加网络传输的开销。因此,需要通过合理的网络调度策略,如流量控制、优先级调度等,来降低这种开销。
zStorage 在某些场景/工作模式下,例如流控模式,可以通过限制读请求的转发数量,或者开启/关闭请求转发,来保证当前系统的稳定性。
测试结果
通过一系列的性能测试,zStorage 展示了其卓越的优化效果。在引入优化策略前后,P99时延得到了显著降低,IOPS(输入/输出操作每秒)性能也更加稳定,响应速度有了明显改善,尤其是在高负载环境下,用户体验得到了显著提升。
结语
zStorage 通过降低尾延迟,提升了用户对应用的满意度。未来,zStorage将继续探索新的技术和方法,进一步优化系统性能。