02 2013存档

如果一台服务器上跑很多应用,对资源的隔离当然是不言而喻的,但是很多时候,你即使在一台机器上就跑一个应用,也可能需要资源控制。比如,你的服务器是提供在线查询服务的,数据放在硬盘上,部分热数据在内存中,一切顺利,但是,某天你在这台服务器上scp数据文件过来时,发现磁盘被拷文件的操作压得喘不过气,以至于查询服务都受到了影响,那这时该怎么办?当然,我们可以用scp -l 来限制拷贝的带宽,避免对磁盘的巨大压力,但如果同步数据不是用的scp,是用户自己的某个工具或者是自己写的某个程序,那么还需要去改程序吗?难道每个用户开发的程序都要带上控制带宽和资源使用率的功能?

现在比较建议的解决办法是用cgroup来隔离资源,而到io层面,常用的就是iothrottle。iothrottle已经在公司的生产环境中使用,最近运维考虑扩大使用范围,所以针对运维和DBA的一些疑问,我做了一些iothrottle的测试,不是什么高深的测试方法,但是确实能回答使用者的一些问题,测试报告见 


希望能给大家一些帮助,和信心
问题都来自 pamirs 的信,感谢他对bigalloc特性的关注。


问:文件分配的时候,ext4文件系统请求的时候是按照blocks来请求,但是ext4文件系统自己会按照cluster来分配(这个的理解是否正确呢?)

答:应该说,不太准确,事实上, ext4文件系统请求分配磁盘空间的时候也是按照cluster来请求的了,ext4_ext_map_blocks() 函数是用来检查文件的逻辑位置对应的物理块的,里面申请新磁盘空间的调用是:

        ar.len = EXT4_NUM_B2C(sbi, offset+allocated);
        ......
        newblock = ext4_mb_new_blocks(handle, &ar, &err);

ar.len的单位是cluster,所以实际上申请空间就是以cluster为单位


问:如果cluster为32K(8个blocks), 那么对于一个3k的文件来说,一次就分配了一个cluster,这样就有7个blocks不能在被其他文件使用了。group desc中的block_bitmap中将cluster对应的bit位置1,那么后续这个文件在增加的时候,是否按照增加的blocks数量,以及当前该文件占用的cluster,计算出已经占用的cluster中有多少blocks是空闲的,还可以继续分配呢?

答:是的,需要一些琐碎的计算,这些计算的代码都放在了函数get_implied_cluster_alloc()里


问:ext4_group_desc中的bg_free_blocks_count_lo字段表示当前group中有多少空闲的blocks,使用了bigalloc之后,该字段的意义并没有发生变化吧?好像没有看到有新增一个字段来表示free_clusters数量,这个是否不需要保存这样的变量?通过bitmap查询得知呢?

答:bg_free_blocks_count_lo的含义实际是空闲的cluster的数量,看这个函数
ext4_free_group_clusters_set被调用的地方就知道了。这个变量名比较误导,Ted在添加bigalloc特性的时候更多的想到的是完成google gfs所需要的功能,所以代码上没有那么完备和整洁。

关于存档

This page is an archive of entries from 02 2013 listed from newest to oldest.

01 2013 is the previous archive.

03 2013 is the next archive.

Find recent content on the main index or look in the 存档 to find all content.