在做分布式存储ceph项目中,遇到一个数组过大,导致栈空间内存申请失败问题,特记录一下。
问题描述:
在ceph块存储实现架构中,对用户提供逻辑卷(image),内存数据保存时,将image切分成对象(object)进行落盘。image比较大,一般为TB级别,object大小固定一般为4M(可通过参数配置,默认4M),故一个1TB的卷可切分为262144个object。在一个处理image读写流程中,需遍历各object以判断其状态,创建一个临时数组存放object,形式为:short object[num],此处num为object总个数,然后对此数组进行初始化:memset(&object, 0, sizeof(object));当卷大小大于等于16T时,程序运行至memset处崩溃,产生core文件。
原因分析:
1. 16T卷可切分成4194304个对象,申请数组大小占用内存为4194304*2(short两字节)= 8M,此内存在栈空间申请。
2. 栈空间分配内存最大为8M(不同系统略有不同),一次分配达到或者超过就会溢出。
解决方法:
在堆空间上申请该数组空间,具体为使用new/delete处理该数组,或者使用vector处理该数组。
参考:
http://bbs.bccn.net/thread-414907-1-1.html
https://blog.csdn.net/u011563434/article/details/51265487?utm_source=blogxgwz6