bcache拥塞控制原理代码层梳理
概述
bcache的拥塞只针对cache设备侧的监控,一个bcache设备的拥塞控制是读写共用的:即配置了读/写拥塞任意一个,都会对整个bcache的IO下发造成影响。
拥塞控制原理(3.10内核)
通过代码走读,其拥塞控制拥有“监控端”“控制端”两部分。
监控端负责在IO完成时发现当前设备是否出现“拥塞”状况,同时调整拥塞值。
控制端负载在IO下发前根据设备拥塞值评估是否要下发IO到cache盘。
1.监控端
bcache读写cache盘的开始和结束,会进行用IO耗时计算工作。具体分为写IO处理流程和读IO处理流程:
写IO:
下发IO前记录IO下发时间:
__bch_submit_bbio
-> b->submit_time_us = local_clock_us();
写IO返回后:
cached_dev_write_complete
-> cached_dev_bio_complete
-> search_free
-> bio_complete 标记该IO完成
-> bio_endio
-> bch_insert_data_endio
-> bch_bbio_endio
-> bch_bbio_count_io_errors 拥塞控制监控函数
读IO:
下发IO前记录IO下发时间:
__bch_submit_bbio
-> b->submit_time_us = local_clock_us(); 记录下发时间
读IO cache miss返回后:
request_read_done_bh
-> request_read_done
-> bio_complete
-> bio_endio
-> bch_cache_read_endio
-> bch_bbio_endio
-> bch_bbio_count_io_errors 拥塞控制监控
bch_bbio_count_io_errors函数做的事情:
2.控制端
在IO下发前根据当前cache设备的拥塞状态,即将下发的IO信息,判断是否触发拥塞控制。
触发流程:
request_write/read:
-> check_should_skip
-> bch_get_congested
bch_get_congested做的事情:
check_should_skip做的事情: