存储结构中的对齐(alignment)
最近,在测试基于ceph的小文件合并方案(见上个博文)时,遇到一个怪异的现象:将librados提供的append接口与我们封装的WriteFullObj接口(osd端是append操作和kvdb的put操作)对比,在处理同样大小的文件时(如4KB,8KB等),WriteFullObj比librados的append操作tps低很多,最初怀疑可能是kvdb的put操作的原因,后来将osd端kvdb的put临时去掉,tps仍然上不去;后来使用iostat观察osd上状态,发现WriteFullObj时,uitl在50%左右,wait cpu在40左右,而librados的append则没这么高。。。。。。。。。。。再仔细观察,WriteFullObj时,r/s对应read操作在30甚至更高,而librados的append则几乎为0。。。。。。。。。。再比较二者的差异,将librados的append操作在刚刚WriteFullObj操作的文件,现象和WriteFullObj一样了。。。。再比较两个操作的文件差异,WriteFullObj操作文件大小非4KB整数倍,非4KB整数倍大小是在情理之中,因为合并时,每个小文件数据前附加了36B大小的元数据描述信息,但这为什么会影响写的性能表现和上述现象呢?脑中闪现以前做磁盘分区时遇到的情况:“warning:partition is not properly aligned for best performance”;那么在读写文件时,是否也要类似地保持alignment以提升性能呢?
经过研究结果如下:
扇区(sector)是磁盘的最小存储单位,通常为512B;块(block)是文件系统中存取的最小单位,通常为1024、2048或4096B,块也是文件系统分配和回收空间的最小单位;
当write向文件末尾追加数据时,文件系统会尝试为数据分配数据块,如果是对数据块的部分写入操作,则需要先将数据块的数据读出(此时可能会被阻塞),然后再整体写入(fetch-before-write);
当一个磁盘文件大小非4KB(块大小)整数倍大小,在文件末尾追加数据就是上述的部分写入操作,从而出现上述read操作很高的现象;
为了证实上述结论,测试如下:
A. 文件系统块大小4KB,调用librados的append操作,每次append数据量大小为1KB,文件最初不存在;
B. 用iostat查看,第4k+1次append时,read量几乎为0;第4k+2、4k+3、4k+4次append时,read量开始飙升;
符合预期;
同样原理,跨block读也无法将系统性能充分发挥;
为了充分提供系统性能,设计存储结构时就需要避免此类情况,业界常用的方案就是padding,write操作在4KB整数位置处;
参考:
http://www.seagate.com/cn/zh/tech-insights/advanced-format-4k-sector-hard-drives-master-ti/
https://blogs.oracle.com/dlutz/entry/partition_alignment_guidelines_for_unified
https://www.usenix.org/system/files/conference/fast15/fast15-paper-campello.pdf
http://www.storage-switzerland.com/Articles/Entries/2011/10/27_Improving_VMware_Storage_I_O_Performance_By_Realigning_Partitions.html
http://www.storagereview.com/the_impact_of_misalignment
http://noops.me/?p=747
------------------------------------
http://www.cnblogs.com/wuhuiyuan/p/4760030.html
个人原创,转载请注明出处。
存储结构中的对齐(alignment)的更多相关文章
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...
- c语言结构体在内存中存储,字节对齐
注意: 出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则: (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除: (2)结构体每个 ...
- [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; ...
- C语言结构体在内存中的存储情况探究------内存对齐
条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类 ...
- C-边界对齐
转自:http://blog.csdn.net/b_h_l/article/details/7738197 许 多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值 ...
- 数据对齐 posix_memalign 函数详解
对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- c语言中struct的内存对齐
为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制.这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员 ...
- C语言-结构体内存对齐
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
随机推荐
- ORM存储过程和实体类代码生成工具
ORM存储过程和实体类生成工具 自己写的一个ORM框架的存储过程和实体类生成工具,具体界面如下: 操作步骤: 1.设置数据库连接: 2.选择要生成的表或视图: 3.选择要生成的存储过程类型: 4.如果 ...
- git python
GitPython 1.0.2 : Python Package Index gitpylib 0.2.1 : Python Package Index python - How to checkou ...
- 新浪新闻API接口
头条 http://api.sina.cn/sinago/list.json?channel=news_toutiao推荐 http://api.sina.cn/sinago/list.json?ch ...
- [Objective-c 基础 - 1.1] OC类
Obj-C中没有包得概念,使用前缀进行区分 自带类用NS开头命名 关键字使用@开头 A. 第一个OC程序 1. 导入Foundation框架的主头文件 #import <Foundation ...
- Cocos2d-x 重写draw方法绘制直线等图形时被遮挡覆盖问题的一种解决方案
最近在学习过程cocos2dx的过程中需要使用到绘制直线的功能,所以我就采用了引擎中 ccDrawLine 方法,然后重写 draw 方法,在该方法中绘制直线. 但是出现了一个问题,那就是绘制的图形被 ...
- 本地开发 localhost链接数据库比127.0.0.1慢
自己手写一段代码的时候发现一个问题 链接数据库的时候 用 127.0.0.1比localhost明显的快,localhost要等一下才会有响应 而127.0.0.1就是瞬间响应.一番排查,发现了一个 ...
- 【WIN32进阶之路】:内存映射文件
第一章:源起 遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决 ...
- 最全面的Android Intent机制讲解
对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样.在 Intent 的使用中你看不到直接的函数调用,相对函 ...
- [Heroku] How to pull, push changes
1. First you need to login heroku: heroku login 2. Then you need to download the code: heroku git:cl ...
- [AngularJS] Transclude -- using what existing in DOM to replace the template elements in directive
var app = angular.module("phoneApp", []); app.controller("AppCtrl", function($sc ...