diff --git a/hgalloc/README.md b/hgalloc/README.md index 22b5efb8feb3f9bfe869aaf91ed5f8877ffe56ec..a4c186f2d36f74733fd8d344e3b3072ea6b93b8d 100644 --- a/hgalloc/README.md +++ b/hgalloc/README.md @@ -1,41 +1,46 @@ -欢迎使用hgalloc! +欢迎使用! -# 1. hgalloc +# 1. libhjemalloc ## 1.1 简介 -hgalloc是一个通用的高性能内存库,主要应用于服务器的大内存应用场景,它是基于开源jemalloc内存库做的大页、slab块特性优化,在Benchmark SPEC CPU 2017中520、523课题性能提升10%+。 +hjemalloc是一个通用的高性能内存库,基于jemalloc,结合海光CPU架构,进行内存页面、slab块特性优化,提升大内存块高频访问性能。 ## 1.2 使用 -将hgalloc内存库压缩包解压到环境中,使用参考如下 -- 方法1:编译时指定动态库路径链接进去,比如gcc -o xx -L$[HGALLOC_LIB64_PATH] -lhgalloc xx.c; -- 方法2:设置环境变量LD_PRELOAD,执行程序时先提前加载内存库,比如export LD_PRELOAD=/path/libhgalloc.so,然后执行程序; +将hjemalloc内存库压缩包解压到环境中,使用参考如下 +- 方法1:编译时指定动态库路径链接,如 gcc -o xx -L$[HJEMALLOC_LIB64_PATH] -lhjemalloc xx.c +- 方法2:通过 export LD_PRELOAD=/path/libhjemalloc.so.1.0.0 设置环境变量强制程序在运行时优先加载指定的内存库。 +之后在该shell环境启动业务应用或测试程序,通过lsof或pmap命令查看库是否被调用 -**限制说明:** -- 性能效果仅限制SPEC2017场景; -- 压缩包中同时提供64位/32位的动态库,客户可按需使用; -- 优化需要保证透明大页配置为always; -- 详细用法可参考https://jemalloc.net; +**风险说明:** +- 需要保证透明大页配置为always, echo always > /sys/kernel/mm/transparent_hugepage/enabled; +- 基础库版本依赖Glibc ≥ 2.17,当前无法兼容支持更早期的glibc(若有需求可联系海光定制)。 +- 由于内存分配和布局策略的不同,相比默认malloc内存消耗量可能会更大,在接近物理内存总量的大内存用量应用场景可能导致OOM。 +- 对于未频繁进行内存分配/释放的场景,相比默认malloc机制可能无性能提升,需充分实测。 -## 1.2 平台支持 -当前支持 `Linux/x86_64` 平台。 -# 2. hgalloc_numa +# 2. libhtcmalloc ## 2.1 简介 -hgalloc_numa是一个通用的NUMA aware内存库,重写用户态的malloc/free函数,保证程序在内存分配/使用/释放的亲和性,减少远端访问时延,在高并发程序上如数据库可以提高10%的性能。 - -适用场景: -- 高并发:客户的并发线程数需要多个NODE的CPU核,越多越好 -- 大内存:客户使用的内存量越大,内存管理的亲和性效果越好 -- 远端访问:统计客户程序远近端访问内存的比例,远端访问比例越高,内存管理的亲和性效果越好 +htcmalloc是基于google tcmalloc开发的一个通用NUMA aware内存库,重写了用户态的malloc/free函数,保证程序在内存分配/使用/释放的亲和性,减少远端访问时延,在高并发程序(如数据库),相对Glibc原生函数有一定的性能优势。 +主要适用的应用程序场景: +- 高并发:应用程序需要跨多个 NUMA 节点的 CPU 资源,并发线程数量越多,性能优化效果越显著。 +- 大内存:程序运行时占用大量内存资源,内存使用量越大,内存亲和性管理带来的性能提升越明显。 +- 远端访问:程序存在大量远端内存访问行为,远端访问比例越高,通过内存亲和性优化获得的性能提升越显著。 ## 2.2 使用 -将hgalloc_numa压缩包解压到环境中,使用参考如下 -- 方法1:编译时指定动态库路径链接进去,比如gcc -o xx -L$[HGALLOC_NUMA_PATH] -lhgalloc_numa xx.c; -- 方法2:设置环境变量LD_PRELOAD,执行程序时先提前加载内存库,比如export LD_PRELOAD=/path/libhgalloc_numa.so,然后执行程序; +将htcmalloc压缩包解压到环境中,使用参考如下 +- 方法1:编译时指定动态库路径链接进去,比如gcc -o xx -L$[HTCMALLOC_LIB64_PATH] -lhtcmalloc xx.c。 +- 方法2:设置环境变量LD_PRELOAD,执行程序时先提前加载内存库,比如export LD_PRELOAD=/path/libhtcmalloc.so.1.0.0,然后执行程序; + +**风险说明:** +- 操作系统内核要求:内核版本:Linux Kernel ≥ 4.19,即支持 rseq (Restartable Sequences,一种用于提升多核系统中并发操作性能的技术) 技术的版本。 +- 基础库版本要求:Glibc ≥ 2.17,libstdc++ > 6.0.28(随 GCC 9.4+ 发布)。 +- 特殊配置说明:对于 Glibc 2.35 及更高版本,需要禁用其内置的 rseq 机制,需在运行前设置以下环境变量(否则可能与 htcmalloc 产生冲突): +export GLIBC_TUNABLES=glibc.pthread.rseq=0, Glibc 2.35 中使用了rseq机制,主要效果为提升了sched_getcpu() API函数的速度 (获取当前运行cpu number)如果业务场景是频繁的调用glibc的getcpu 可能存在性能影响。 +- 由于内存分配和布局策略的不同,相比默认malloc内存消耗量可能会更大,在接近物理内存总量的大内存用量应用场景可能导致OOM。 + -**限制说明:** -- 运行环境要求kernel大于4.19版本,支持hgalloc_numa内存库使用rseq技术 -- 运行环境glibc版本在2.35之后需要关闭glibc的rseq机制,避免和hgalloc_numa冲突,export GLIBC_TUNABLES=glibc.pthread.rseq=0 +## 3 平台支持 +仅支持 `Linux/x86_64` 平台。 diff --git a/hgalloc/hgalloc_1.0.1.tar b/hgalloc/libhjemalloc_1.0.0.tar similarity index 50% rename from hgalloc/hgalloc_1.0.1.tar rename to hgalloc/libhjemalloc_1.0.0.tar index 85484567d12949d37b53fb4bc6f7bbdb387297d3..3ff653909e821907ccbed9f01a6dfcf123bb3938 100644 Binary files a/hgalloc/hgalloc_1.0.1.tar and b/hgalloc/libhjemalloc_1.0.0.tar differ diff --git a/hgalloc/hgalloc_numa_lib_1.0.0.tar b/hgalloc/libhtcmalloc_1.0.0.tar similarity index 99% rename from hgalloc/hgalloc_numa_lib_1.0.0.tar rename to hgalloc/libhtcmalloc_1.0.0.tar index 4fd1ba0b11b5798c9f6c93e992337047730884e6..73f4658976e08f0a0fdffd0d0d309a429f4bfcd8 100644 Binary files a/hgalloc/hgalloc_numa_lib_1.0.0.tar and b/hgalloc/libhtcmalloc_1.0.0.tar differ