google-perftools安装以及其配置优化_do you have tcmalloc or google-perftool(1)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

利用TCMalloc优化Nginx的性能:

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。 要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程:

1.安装libunwind库

可以从http://download.savannah.gnu.org/releases/libunwind下载相应的libunwind版本,这里下载的是libunwind-0.99-alpha.tar.gz,安装过程如下

[root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz

[root@localhost home]# cd libunwind-0.99-alpha/

[root@localhost libunwind-0.99-alpha]#CFLAGS=-fPIC ./configure

[root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC

[root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC install

2.安装google-perftools
可以从http://google-perftools.googlecode.com下载相应的google-perftools版本,这里下载的是google-perftools-1.8.tar.gz,安装过程如下:
[root@localhost home]# tar zxvf google-perftools-1.8.tar.gz
[root@localhost home]# cd google-perftools-1.8/
[root@localhost google-perftools-1.8]# ./configure
[root@localhost google-perftools-1.8]# make && make install
[root@localhost google-perftools-1.8]# echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf
[root@localhost google-perftools-1.8]# ldconfig
至此,google-perftools安装完成。

3.重新编译Nginx
为了使Nginx支持google-perftools,需要在安装过程中添加“–with-google_perftools_module”选项重新编译Nginx,安装代码如下:
[root@localhostnginx-0.7.65]#
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-google_perftools_module

[root@localhost nginx-0.7.65]#make
[root@localhost nginx-0.7.65]#make install

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

路线、讲解视频,并且后续会持续更新**

如果你需要这些资料,可以戳这里获取

google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。 1. 编译目标程序,加入对 google-perftools 库的依赖。 2. 运行目标程序,并用某种方式启动 / 终止剖析函数并产生剖析结果。 3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如 pdf,txt,gv 等)。 安装 您可以在 google-perftools 的网站 (http://code.google.com/p/google-perftools/downloads/list) 上下载最新版的安装包。为完成步骤 3 的工作,您还需要一个将剖析结果转化为程序员可读文档的工具,例如 gv(http://www.gnu.org/software/gv/)。 编译与运行 您需要在原有的编译选项中加入对 libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。例如本例中作者的系统中,libprofiler.so 安装在"/usr/lib"目录下,所以需要在 makefile 文件中的编译选项加入“-L/usr/lib -lprofiler”。 google-perftools 需要在目标代码的开始和结尾点分别调用剖析模块的启动和终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的 CPU 时间片进行统计和分析。工具的启动和终止可以采用以下两种方式。 a. 使用调试工具 gdb 在程序中手动运行性能工具的启动 / 终止函数。 gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍。使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。 命令 功能 ctrl+c 暂停程序的运行 c 继续程序的运行 b 添加函数断点(参数可以是源代码中的行号或者一个函数名) p 打印某个量的值或者执行一个函数调用 b. 在目标代码中直接加入性能工具函数的调用,该方法就是在程序代码中直接加入调试函数的调用。 两种方式都需要对目标程序重新编译,加入对性能工具的库依赖。对于前者,他的好处是使用比较灵活,但工具的启动和终止依赖于程序员的手动操作,常常需要一些暂停函数(比如休眠 sleep)的支持才能达到控制程序的目的,因此精度可能受到影响。对于后者,它需要对目标代码的进行修改,需要处理函数声明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都需要重新编译,灵活度不高,读者可以根据自己的实际需求采用有效的方式。 示例详解 该程序是一个简单的例子,文中有两处耗时的无用操作,并且二者间有一定的调用关系。 清单 1. 示例程序 void consumeSomeCPUTime1(int input){ int i = 0; input++; while(i++ < 10000){ i--; i++; i--; i++; } }; void consumeSomeCPUTime2(int input){ input++; consumeSomeCPUTime1(input); int i = 0; while(i++ < 10000){ i--; i++; i--; i++; } }; int stupidComputing(int a, int b){ int i = 0; while( i++ < 10000){ consumeSomeCPUTime1(i); } int j = 0; while(j++ < 5000){ consumeSomeCPUTime2(j); } return a+b; }; int smartComputing(int a, int b){ return a+b; }; void main(){ int i = 0; printf("reached the start point of performance bottle neck\n"); sleep(5); //ProfilerStart("CPUProfile"); while( i++ MyProfile.pdf 转换后产生的结果文档如下图。图中的数字和框体的大小代表了的某个函数的运行时间占整个剖析时间的比例。由代码的逻辑可知,stupidComputing,stupidComputing2 都是费时操作并且它们和 consumeSomeCPUTime 存在着一定的调用关系。 图 1. 剖析结果 结束语 本文介绍了一个 Linux 平台上的性能剖析工具 google-perftools,并结合实例向读者展示了如何使用该工具配置、使用及分析性能瓶颈。
<think>好的,用户想知道如何在Linux中查看某个进程的堆外内存占用。首先,我需要回忆一下Linux内存管理的基本知识。堆外内存通常指的是由程序自己管理的内存,比如Java中的DirectByteBuffer,或者通过mmap分配的内存,这部分不在堆内存里,所以常规的top或ps命令可能无法直接显示。 根据用户提供的引用,引用[4]提到堆外内存泄漏的排查过程,并提到了glibc的64M问题,这可能涉及到内存分配器的情况。引用[5]给出了ps命令的一些用法,可以查看rsz和vsz,但可能不够详细。需要找到更精确的方法。 首先,常用的工具如top和ps可以查看进程的总体内存使用情况,但堆外内存可能包含在RES或VIRT中,但无法区分。这时候可能需要更专业的工具,比如pmap,它可以显示进程的内存映射情况。pmap -x <pid>可以显示详细的内存段,其中anon部分可能包括堆外内存。 另外,/proc/<pid>/smaps文件提供了更详细的内存使用信息。通过分析smaps中的各个内存段,可以找到匿名内存块(Anonymous memory),这些可能对应堆外内存。用户需要手动统计这些部分的大小,比如使用grep和awk命令。 还有,像Valgrind这样的内存分析工具可以用来检测内存泄漏,包括堆外内存。不过Valgrind可能会影响性能,不适合生产环境。此外,jcmd工具适用于Java进程,可以触发堆转储,帮助分析Native Memory Tracking(NMT)的信息,从而查看堆外内存的使用情况。 用户可能是在处理Java应用的问题,或者使用其他语言编写的程序,需要不同的工具。例如,对于C/C++程序,可以使用jemalloc或tcmalloc来跟踪内存分配情况。这些分配器提供的内存分析工具可以帮助识别堆外内存的使用。 总结一下,查看堆外内存的方法包括:使用pmap分析内存映射,检查/proc/<pid>/smaps文件,利用特定工具如jcmd(Java)、Valgrind、jemalloc等。同时,用户需要根据具体的应用类型选择合适的工具,并结合内存泄漏的常见原因进行排查,比如检查文件映射、直接内存分配等。</think>在 Linux 中查看进程的堆外内存占用需要结合特定工具和方法,以下是具体步骤和说明: --- ### 一、堆外内存的概念 堆外内存(Off-Heap Memory)指由程序直接管理且不通过标准堆内存分配器(如 `malloc` 或 `new`)申请的内存,例如: - Java 的 `DirectByteBuffer` - 通过 `mmap` 映射的文件内存 - 使用 `JNI` 调用的本地内存等 --- ### 二、查看堆外内存的方法 #### 1. 使用 `pmap` 命令 通过 `pmap` 分析进程内存映射: ```bash pmap -x <PID> | grep -i anon ``` - **作用**:显示进程的详细内存映射,`anon` 表示匿名内存块(可能是堆外内存)。 - **输出示例**: ``` Address Kbytes RSS Dirty Mode Mapping 00007f8d40000000 10240 0 0 rw--- [ anon ] ``` - **统计总堆外内存**: ```bash pmap -x <PID> | grep -i anon | awk '{sum += $3} END {print sum " KB"}' ``` #### 2. 分析 `/proc/<PID>/smaps` 查看进程的详细内存映射文件: ```bash cat /proc/<PID>/smaps | grep -A 10 'Anonymous' ``` - **关键字段**: - `Anonymous`:匿名内存(堆外内存可能包含在此类内存中)。 - `Rss`:实际驻留内存大小。 - **统计匿名内存总量**: ```bash cat /proc/<PID>/smaps | grep 'Anonymous' | awk '{sum += $2} END {print sum " KB"}' ``` #### 3. 使用 `jcmd`(仅限 Java 进程) 对于 Java 应用,启用 Native Memory Tracking (NMT)1. 启动时添加参数: ```bash java -XX:NativeMemoryTracking=detail ... ``` 2. 查看内存详情: ```bash jcmd <PID> VM.native_memory detail ``` - **输出示例**: ``` Native Memory Tracking: Total: reserved=5GB, committed=2GB - Java Heap (reserved=3GB, committed=1GB) - Class (reserved=1GB, committed=500MB) - Thread (reserved=200MB, committed=50MB) - Code (reserved=250MB, committed=100MB) - GC (reserved=300MB, committed=100MB) - Internal (reserved=100MB, committed=50MB) - Other (reserved=1GB, committed=500MB) # 堆外内存 ``` #### 4. 使用 `valgrind` 检测内存泄漏 通用内存检测工具: ```bash valgrind --tool=memcheck --leak-check=full ./your_program ``` - **适用场景**:开发环境调试,可追踪堆外内存泄漏。 --- ### 三、注意事项 1. **堆外内存与 RSS 的关系** 堆外内存会计入进程的 `RSS`(Resident Set Size),但需通过特定方法分离统计[^4]。 2. **文件映射内存** 使用 `mmap` 映射的文件可能占用堆外内存,可通过 `pmap` 输出的 `mapped file` 部分查看。 3. **性能工具推荐** 生产环境建议使用 `perf` 或 `bcc-tools`(如 `mallocstacks`)进行动态分析[^5]。 --- ### 四、示例场景 **排查 Java 堆外内存泄漏**: 1. 通过 `top` 找到高内存占用的 Java PID[^2]。 2. 使用 `jcmd <PID> VM.native_memory detail` 查看 `Other` 部分。 3. 结合 `pmap -x <PID>` 检查是否有异常的匿名内存块。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值