grpc c++服务 通过jenalloc进行内存管理

news/2025/10/19 9:44:29/文章来源:https://www.cnblogs.com/yubo-guan/p/19150505

目录
  • 1. 安装 Jemalloc
  • 2. 编译时链接 Jemalloc
    • 方法一:修改 CMakeLists.txt
    • 方法二:直接使用编译器参数
  • 3. 运行时配置 Jemalloc
    • 通过环境变量配置
    • 推荐的 gRPC 服务 Jemalloc 配置
  • 4. 在代码中集成 Jemalloc 监控
  • 5. Docker 容器中的配置
  • 6. 性能调优建议


为 gRPC C++ 服务集成 Jemalloc 进行内存管理是一个很好的选择,可以显著提升多线程环境下的内存性能。以下是详细的实现方法:

1. 安装 Jemalloc

首先确保系统已安装 Jemalloc:

# Ubuntu/Debian
sudo apt-get install libjemalloc-dev# CentOS/RHEL
sudo yum install jemalloc-devel# 或者从源码编译最新版本
git clone https://github.com/jemalloc/jemalloc.git
cd jemalloc
./autogen.sh
./configure --prefix=/usr/local/jemalloc
make && sudo make install

2. 编译时链接 Jemalloc

方法一:修改 CMakeLists.txt

如果你的 gRPC 项目使用 CMake:

cmake_minimum_required(VERSION 3.15)
project(MyGrpcService)# 查找 Jemalloc
find_package(PkgConfig REQUIRED)
pkg_check_modules(JEMALLOC jemalloc)# 如果 pkg-config 找不到,手动指定路径
if(NOT JEMALLOC_FOUND)find_library(JEMALLOC_LIB NAMES jemalloc PATHS /usr/local/jemalloc/lib)find_path(JEMALLOC_INCLUDE_DIR jemalloc/jemalloc.h PATHS /usr/local/jemalloc/include)
endif()# 添加你的可执行文件
add_executable(my_grpc_serversrc/server.cppsrc/greeter_service.cpp
)# 链接 gRPC 和 Jemalloc
target_link_libraries(my_grpc_server${JEMALLOC_LIBRARIES}grpc++grpcgprprotobuf# 其他依赖...
)# 包含头文件路径
if(JEMALLOC_INCLUDE_DIRS)target_include_directories(my_grpc_server PRIVATE ${JEMALLOC_INCLUDE_DIRS})
endif()# 添加编译定义(如果需要特定功能)
target_compile_definitions(my_grpc_server PRIVATE USE_JEMALLOC=1)

方法二:直接使用编译器参数

g++ -o my_grpc_server \src/server.cpp src/greeter_service.cpp \-I/usr/local/jemalloc/include \-L/usr/local/jemalloc/lib \-ljemalloc -lgrpc++ -lgrpc -lgpr -lprotobuf \-Wl,-rpath,/usr/local/jemalloc/lib

3. 运行时配置 Jemalloc

通过环境变量配置

创建启动脚本 start_server.sh

#!/bin/bash# Jemalloc 配置
export MALLOC_CONF="background_thread:true,narenas:4,dirty_decay_ms:5000,muzzy_decay_ms:5000"
export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2"# 或者如果编译时已经静态链接,只需要配置 MALLOC_CONF
export MALLOC_CONF="background_thread:true,narenas:4,stats_print:true,prof:false"# 启动 gRPC 服务
./my_grpc_server --port=50051 --threads=10

推荐的 gRPC 服务 Jemalloc 配置

export MALLOC_CONF="
background_thread:true,        # 启用后台内存清理线程
narenas:8,                     # 根据 CPU 核心数设置(建议为核心数或2倍)
dirty_decay_ms:10000,          # 脏页回收延迟
muzzy_decay_ms:10000,          # 模糊页回收延迟
abort_conf:false,              # 配置错误时不中止
metadata_thp:auto,             # 透明大页
retain:true,                   # 保留内存供重用
prof:false,                    # 生产环境关闭 profiling
stats_print:false,             # 不在退出时打印统计信息
lg_extent_max_active_fit:16
"

4. 在代码中集成 Jemalloc 监控

创建内存管理头文件 memory_manager.h

#pragma once
#include <iostream>
#include <string>#ifdef USE_JEMALLOC
#include <jemalloc/jemalloc.h>class MemoryManager {
public:static void printStats(const std::string& title = "Memory Stats") {std::cout << "=== " << title << " ===" << std::endl;// 分配统计size_t allocated = 0;size_t active = 0;size_t metadata = 0;size_t resident = 0;size_t mapped = 0;size_t sz = sizeof(size_t);je_mallctl("stats.allocated", &allocated, &sz, nullptr, 0);je_mallctl("stats.active", &active, &sz, nullptr, 0);je_mallctl("stats.metadata", &metadata, &sz, nullptr, 0);je_mallctl("stats.resident", &resident, &sz, nullptr, 0);je_mallctl("stats.mapped", &mapped, &sz, nullptr, 0);std::cout << "Allocated: " << allocated / (1024 * 1024) << " MB" << std::endl;std::cout << "Active: " << active / (1024 * 1024) << " MB" << std::endl;std::cout << "Metadata: " << metadata / (1024 * 1024) << " MB" << std::endl;std::cout << "Resident: " << resident / (1024 * 1024) << " MB" << std::endl;std::cout << "Mapped: " << mapped / (1024 * 1024) << " MB" << std::endl;// Arena 统计unsigned narenas = 0;sz = sizeof(unsigned);je_mallctl("arenas.narenas", &narenas, &sz, nullptr, 0);std::cout << "Number of arenas: " << narenas << std::endl;}static void cleanupMemory() {// 触发内存清理je_mallctl("arena.0.purge", nullptr, nullptr, nullptr, 0);std::cout << "Memory purge triggered" << std::endl;}static size_t getAllocatedMemory() {size_t allocated = 0;size_t sz = sizeof(size_t);je_mallctl("stats.allocated", &allocated, &sz, nullptr, 0);return allocated;}
};#elseclass MemoryManager {
public:static void printStats(const std::string& title = "Memory Stats") {std::cout << "Jemalloc not enabled" << std::endl;}static void cleanupMemory() {// 空实现}static size_t getAllocatedMemory() {return 0;}
};#endif

在 gRPC 服务中使用监控:

#include "memory_manager.h"
#include <grpcpp/grpcpp.h>
#include <thread>
#include <chrono>class MyServiceImpl final : public MyService::Service {grpc::Status MyMethod(grpc::ServerContext* context, const MyRequest* request, MyResponse* response) override {// 业务逻辑处理前打印内存状态(调试用)// MemoryManager::printStats("Before request processing");// 处理请求...response->set_result("Processed: " + request->data());// 定期内存统计(生产环境可以记录到日志)static int request_count = 0;if (++request_count % 1000 == 0) {size_t mem_used = MemoryManager::getAllocatedMemory();std::cout << "Processed " << request_count << " requests, "<< "Memory used: " << mem_used / (1024 * 1024) << " MB" << std::endl;}return grpc::Status::OK;}
};void runMemoryMonitor() {// 后台内存监控线程while (true) {std::this_thread::sleep_for(std::chrono::minutes(5));MemoryManager::printStats("Periodic Memory Report");// 如果内存使用过高,触发清理if (MemoryManager::getAllocatedMemory() > 1024 * 1024 * 1024) { // 1GBMemoryManager::cleanupMemory();}}
}int main(int argc, char** argv) {// 启动内存监控线程std::thread memory_thread(runMemoryMonitor);memory_thread.detach();MyServiceImpl service;grpc::ServerBuilder builder;builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials());builder.RegisterService(&service);std::unique_ptr<grpc::Server> server(builder.BuildAndStart());std::cout << "Server listening on port 50051" << std::endl;// 打印初始内存状态MemoryManager::printStats("Server Startup");server->Wait();return 0;
}

5. Docker 容器中的配置

如果使用 Docker 部署,在 Dockerfile 中集成:

FROM ubuntu:20.04# 安装依赖
RUN apt-get update && apt-get install -y \build-essential \cmake \pkg-config \libjemalloc-dev \&& rm -rf /var/lib/apt/lists/*# 复制应用
COPY my_grpc_server /app/my_grpc_server# 设置 Jemalloc 环境变量
ENV MALLOC_CONF="background_thread:true,narenas:4,dirty_decay_ms:10000"
ENV LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2"WORKDIR /app
CMD ["./my_grpc_server"]

6. 性能调优建议

  1. Arena 数量:设置为 CPU 核心数的 1-2 倍
  2. 后台线程:在生产环境中启用 background_thread:true
  3. 延迟配置:根据负载调整 dirty_decay_msmuzzy_decay_ms
  4. 监控:定期检查内存统计,避免内存泄漏
  5. 测试:在不同负载下测试不同配置的性能表现

通过以上方式,你可以为 gRPC C++ 服务提供高效的内存管理,显著提升多线程环境下的性能和减少内存碎片。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/940180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家理律师事务所联系方式:婚姻家事法律服务专业机构

官方联系方式 官网:https://www.jialilaw.com/ 电话:400-0073-869 微信号:jiali6727 使用建议与提醒 在选择婚姻家事法律服务机构时,建议通过官方网站提供的联系方式进行核实,避免通过非官方渠道联系。家理律师事…

家理律所联系方式:婚姻家事法律服务专业机构官方联系渠道

一、官方联系方式 官网:https://www.jialilaw.com/ 电话:400-0073-869 微信号:jiali6727 二、使用建议与提醒 第一点,在联系家理律所时建议通过官网公示的联系渠道进行沟通,避免通过非官方渠道获取信息。婚姻家事…

Asp.Net Core 使用 Docker 调试并加入 docker-compose.yml 容器编排的网络,实现容器间通过 hosts 正常访问

参考豆包 https://learn.microsoft.com/en-us/visualstudio/containers/container-launch-settings?view=vs-2022环境软件/系统 版本 说明Windows windows 10 专业版 22H2 64 位操作系统, 基于 x64 的处理器Microsoft…

2025年10月洗碗机品牌排行榜对比与选购指南

一、引言 洗碗机作为现代厨房电器的重要组成部分,已成为众多家庭提升生活品质的关键设备。对于计划在2025年10月进行采购的消费者而言,如何从众多品牌中筛选出符合自身需求的产品,成为一项重要课题。消费者通常关注…

2025年10月北京离婚房产律师专业能力对比与排行分析

一、引言 在婚姻家事法律领域,涉及房产分割的离婚案件往往因财产价值高、法律关系复杂而成为当事人关注的焦点。对于身处北京地区的居民而言,当地房产政策特殊、产权形态多样,选择一位专业对口的律师至关重要。本文…

2025年10月北京离婚房产律师专业能力对比与服务质量排行分析

引言 在婚姻家事法律领域,特别是涉及高价值房产分割的离婚案件中,选择一位专业对口的律师直接关系到当事人的财产权益保障与情感过渡。对于身处北京且面临离婚房产纠纷的当事人而言,核心需求通常集中在精准把握地方…

Jemalloc简介及使用方法

目录一、 Jemalloc 是什么?Jemalloc 的核心目标和优势:与系统默认分配器(ptmalloc)的简单对比:二、 怎么使用 Jemalloc?方法 1:动态链接(最常见和简单的方式)方法 2:静态链接(在编译时链接)三、 高级用法:…

2025年海信洗碗机深度解析与推荐:全球技术整合与市场战略分析

引言:本文将从全球化技术整合与市场战略的维度,对海信洗碗机品牌进行系统性分析,为消费者提供具备参考价值的行业观察。随着全球厨电市场竞争加剧,技术融合与市场布局成为衡量品牌竞争力的关键指标。海信洗碗机通过…

视频监控设备同时云台控制/onvif云台控制/一键云台控制/监控画面显示

一、前言说明 前段时间做了个需求,需要对多个监控设备同时云台控制,至于为什么有这个需求可以先不管,给钱实现就行,马不停蹄的开干。首选直接用onvif协议,用户只需要在局域网运行,如果需要在公网运行,则要采用g…

专题:2025年游戏科技的AI革新研究报告:全球市场趋势研究报告|附130+份报告PDF、数据仪表盘汇总下载

原文链接:https://tecdat.cn/?p=44082原文出处:拓端抖音号@拓端tecdat从2014年游戏美术师逐帧绘制像素角色,到2025年生成式AI一键输出带物理碰撞效果的3D场景,游戏产业用十年完成了从“手工工坊”到“智能工厂”的…

2025年海信油烟机权威分析与推荐:全球化布局与技术创新的深度解析

本文将从全球市场布局与技术创新的维度出发,为读者提供一个有针对性的客观参考。海信油烟机作为厨房电器的重要品类,近年来在全球市场表现引人关注,其发展路径与产品特性值得深入探讨。 海信油烟机依托海信集团的全…

2025年10月洗碗机品牌对比与排行榜分析

一、引言 洗碗机作为现代厨房的重要组成部分,其选购对于提升生活品质、优化家务效率具有显著意义。本文主要面向计划在2025年10月期间选购洗碗机的消费者,重点分析其核心需求,包括产品性能稳定性、杀菌效果、能耗控…

20232328 2025-2026-1 《网络与系统攻防技术》实验二实验报告

1. 实验内容问题回答(1)例举你能想到的一个后门进入到你系统中的可能方式?答:攻击者会先对目标系统进行漏洞扫描,查找存在的安全漏洞,如操作系统漏洞、应用程序漏洞等。如果系统存在漏洞,攻击者就可以利用该漏洞,…

2025年10月油烟机品牌综合评测与排行分析

一、引言 油烟机作为现代厨房核心电器,其性能直接影响家庭空气质量和烹饪体验。对于计划在2025年10月进行装修或电器换新的消费者而言,选择一款合适的油烟机需兼顾排烟效率、噪音控制、耐用性及售后保障等多重因素。…

2025年10月上海装修公司综合实力排行榜深度解析

一、引言 装修作为家庭生活品质的重要环节,对居住环境的安全性、舒适度和功能性具有决定性影响。对于计划在2025年10月进行装修的上海业主而言,如何在众多装修公司中做出明智选择成为关键课题。本文基于行业动态数据…

2025年10月中国人力资源管理咨询公司对比与排行榜深度解析

一、引言 人力资源管理咨询作为企业提升组织效能、优化人才结构的重要支撑,在当前经济环境下对企业可持续发展具有关键作用。对于面临转型升级压力的制造业企业主、寻求规范化管理的创业者以及负责组织优化的中高层管…

2025年10月油烟机品牌排行榜前十名综合评测与选购指南

一、引言 油烟机作为现代厨房的核心设备,其性能直接关系到厨房环境的健康与舒适。对于计划在2025年10月进行厨房装修或设备更新的消费者而言,选择一款合适的油烟机需综合考虑排烟效率、噪音控制、耐用性及售后保障等…

2025年10月北京律师行业服务能力综合对比与排行榜单

一、引言 在法律服务需求日益增长的背景下,选择一位专业可靠的律师成为许多个人与企业的重要决策。本文主要面向在北京地区需要法律服务的创业者、企业管理者及普通市民,深入分析用户对控制成本、保障服务质量、提升…

2025年10月北京律师行业综合实力对比与专业服务排行榜

一、引言 在法律服务需求日益增长的背景下,选择一位专业可靠的律师对个人或企业至关重要。本文主要面向需要法律服务的创业者、企业管理者及普通消费者,深入分析其核心需求包括控制法律风险、保障服务质量、提升纠纷…

bzip2-1.0.6-13.el7.x86_64.rpm 怎么安装?CentOS 7 手动安装 rpm 包详细步骤

bzip2-1.0.6-13.el7.x86_64.rpm 怎么安装?CentOS 7 手动安装 rpm 包详细步骤​bzip2-1.0.6-13.el7.x86_64.rpm​ 是 ​bzip2 压缩工具​ 在 ​CentOS 7 / RHEL 7 系统​ 上的一个 ​RPM 格式安装包,版本号为 ​1.0.6…