谈操作内存malloc,memset对程序时间的影响

背景

这两天在看postgis在分布式数据库的使用,由于postgis的插件的sql文件内部包含了自定义表及向表中插入数据的insert操作。

由于现在postgre-xc上create extension 逻辑:

现在本地coordinator上执行完该sql文件; 

再在各个datanode及其他coordinator上执行。

由于在coordinator上执行insert 语句会将insert语句下发(如果时本地表则不用下发到datanode上),因此避免insert 语句下发(下发会报错,因为此时datanode上尚未执行sql文件,对应的表还未建立), 需要将sql文件创建表按本地表创建(\dS+ tablename)。

修改postres-xc文件,将create extension涉及的表处理改为本地表(stmt->distributeby为NULL则建立的表是本地表)。

但是在测试过程发现create extension postgis 执行过程中消耗的内存不太合理,每执行1行insert操作(共5k多行)就会消耗5MB内存左右,通过调试execute_sql_string 函数,发现pg_analyze_and_rewrite 函数涉及占用内存,发现主要有关Query结构体的变量sql_statement 会申请内存,由于postgresql这样的数据库使用内存上下文方式进行内存管理,应该是执行命令create extension postgis结束时统一释放,避免内存泄漏,但是这种每执行一行就申请sql语句大小的内存并不是好的处理方式:

1.如果sql过大,则每次占用的内存很多,虽然最后会统一释放,但是如果insert 行数过多,则可能引起OOM。

 2.内存的申请根据个人理解是较占用时间的(相对于执行add, mov这样的,应该是这样命令执行时间的好几个数量级)。

个人现在通过针对sql_statement申请内存进行处理(不再申请内存),使占用的内存总量不会太大,自测postgis-2.4.5已可以执行,相比之前的执行时间(虽然之前会失败,至失败时执行时间75s),现在这种执行时间时间变少了(现在总共8s。 若改为在合适的地方(pg_plan_queries)释放sql_statement申请的内存则总共执行时间约25s)。

不过比较好的方式是修改Query结构体,通过指针位置及涉及语句长度这样的变量来定位要执行的语句(现在的sql_statement内容是sql文件的多个sql的字符串), xl 用的这种,时间约5s。

对申请内存占用时间的分析

之前在水木上看到过讨论一段代码到底是哪些操作会较大影响程序时间,记得主要是内存的申请及memset,个人准备研究下为什么会产生影响,以及有无优化的方法。

 

后续待补。

 

参考

malloc()之后,内核发生了什么

 

转载自:https://blog.csdn.net/huguangshanse00/article/details/84182774

You may also like...