所以,我的Sidekiq工作人员有内存泄漏.我有一个工作服务器,只有一个队列用于此工作任务,一周内可以获得大约10G的RSS.
我尝试在本地重现它只有一个工作线程和瞧 - 我在一个晚上从200M到1G,处理1个任务/分钟.当然,我想知道泄漏了什么,所以我也记录了RSS,heap_live_slots和heap_free_slots.当我绘制结果时,我可以看到稳定的RSS增长,而实时和空闲时隙随机波动,但是在明确定义的和恒定的边界内,而它们的总和保持不变.
在这一点上,我得出结论,泄漏可能不是在Ruby代码中发生,而是在某些原生扩展中.所以我通过RVM重新安装了带有Jemalloc支持的ruby:
rvm reinstall 2.4.2 --with-jemalloc
然后我设置MALLOC_CONF
:
export
MALLOC_CONF='prof_leak:true,lg_prof_sample:0,prof_final:true,stats_print:true'
并启动Sidekiq.刚开始使用1个工作线程的Sidekiq值得大约200M RSS,但是当我按下Ctrl + C并查看jemalloc的stats输出时,我看到完全不同的东西:
Arenas: 32
Quantum size: 16
Page size: 4096
Maximum thread-cached size class: 32768
Allocated: 34056, active: 61440, metadata: 2949272, resident: 2981888, mapped: 6352896, retained: 2035712
Run Code Online (Sandbox Code Playgroud)
什么?6M映射?这不可能是真的.所以我开始irb并执行以下操作:
2.4.2 :001 > arr = []
=> []
2.4.2 :002 > loop do
2.4.2 :003 > arr << 'a'*10000000
2.4.2 :004?> sleep 1
2.4.2 :005?> end
Run Code Online (Sandbox Code Playgroud)
在等到irb进程爬升到大约1G RSS之后我停止了这个过程...并看到完全相同的数字.也许可视化调用图将帮助我了解正在发生的事情?
jeprof --show_bytes --pdf `which …
Run Code Online (Sandbox Code Playgroud) OSX/Monterey/M1/Arm/Homebrew:我一生都无法让它工作:
./configure --with-jemalloc
Run Code Online (Sandbox Code Playgroud)
它死了
checking jemalloc/jemalloc.h presence... no
configure: error: jemalloc requested but not found
Run Code Online (Sandbox Code Playgroud)
即使它就在那里:/opt/homebrew/Cellar/jemalloc/5.2.1_1/include/jemalloc/jemalloc.js
。
brew --prefix jemalloc
一切看起来都是jemalloc-config --includedir
正确的。
我尝试过各种版本:
export RUBY_CONFIGURE_OPTS="--with-jemalloc-include=$(brew --prefix jemalloc)/include
Run Code Online (Sandbox Code Playgroud)
和/或
./configure --with-jemalloc-include=$(brew --prefix jemalloc)/include
Run Code Online (Sandbox Code Playgroud)
但没有骰子。甚至不确定这些环境变量/标志是否受到 ruby 的尊重,或者它们是否是一些 rvm/rbenv/ruby-build 的东西。
我打算直接使用 ruby 的配置而不是 rvm/build 工具进行所有测试。
我在ubuntu 12.04.5 LTS上尝试用jemalloc安装ruby.jemalloc已成功安装(https://blog.scalingo.com/2017/05/02/improve-ruby-application-memory-jemalloc.html),但在安装ruby 2.3.4时,它出现了以下错误.
>rvm install 2.3.4 -C --with-jemalloc
Warning, new version of rvm available '1.29.1', you are using older version '1.27.0'.
You can disable this warning with: echo rvm_autoupdate_flag=0 >> ~/.rvmrc
You can enable auto-update with: echo rvm_autoupdate_flag=2 >> ~/.rvmrc
ruby-2.3.4 - #removing src/ruby-2.3.4..
Checking requirements for ubuntu.
Requirements installation successful.
Installing Ruby from source to: /home/deploy/.rvm/rubies/ruby-2.3.4, this may take a while depending on your cpu(s)...
ruby-2.3.4 - #downloading ruby-2.3.4, this may take a while depending on …
Run Code Online (Sandbox Code Playgroud) 目前我正在尝试解决Java内存问题:我的Java应用程序不断使用越来越多的内存,最终它被Linux OOM杀手杀死.
可能存在Native Memory泄漏,因为在使用VisualVM检查JVM后,metaspace和堆看起来都很正常.
使用top命令,我可以看到JVM使用的内存不断增加.
本文的第一个图形:
与我在自己的应用程序中看到的完美匹配.
所以我尝试使用JeMalloc来查找各种文章中描述的泄漏.在这里我遇到了一个问题:在jeprof本身使用jeprof命令和更高版本的top命令时,它确实显示了使用最多内存的函数,但它们都是十六进制地址,因此我必须缺少一些符号.但我不知道我需要哪些包,这是我不知道的.
我已经找到了这个链接: 链接#1
并安装了这个包:debuginfo-install java-1.8.0-openjdk
我试图先完成简单的步骤:
让JeMalloc使用简单的应用程序,例如w.接下来让它与java -version一起使用.到目前为止,我还可以从JeMalloc获得完美概述的PDF文件.
接下来让它与java -jar一起工作simpletest.jar <<这里我缺少符号例如,如果我不在这里关闭GZipInputStream,那么它不会出现在JeMalloc结果中.
接下来让它使用java -jar myapplication.jar <<这里我也缺少符号.
所以我的问题基本上是:为了让JeMalloc显示所有符号名称以调试应用程序,我需要哪些软件包,例如:
public void test1() {
InputStream fileInputStream = null;
GZipInputStream gzipInputStream = null;
try {
fileInputStream = new FileInputStream("test.zip");
gzipInputStream = new GZIPInputStream(fileInputStream);
int data = gzipInputStream.read();
while (data != -1) {
// do something with data
data = gzipInputStream.read();
}
} catch (Exception ex) {
} finally {
// Disabled to see whether JeMalloc can detect …
Run Code Online (Sandbox Code Playgroud) Node.js 可以与 Jemalloc 一起使用(https://github.com/nodejs/node/issues/21973)。在大多数情况下,它会缩短 RSS,这是我的大问题。
但我找不到任何有关如何将节点与 Jemalloc 一起使用的信息,也找不到在机器上或在 docker 中的信息。
有人可以帮忙吗?
我正在尝试调试一些供应商提供的 JNI/本机代码中的内存泄漏,并且像许多人一样,从这里开始:https: //technology.blog.gov.uk/2015/12/11/using-jemalloc - 找到内存泄漏的根源/
我发现如果我运行:
export MALLOC_CONF=prof:true,lg_prof_interval:30,lg_prof_sample:17
Run Code Online (Sandbox Code Playgroud)
然后运行我的应用程序,然后运行jeprof ...
命令生成 .gif 我可以看到导致泄漏的 JNI 函数名称(这很好!)。
我尝试更改lg_prof_interval:30
为lg_prof_interval:25
更频繁地生成 .heap 文件,但我发现我之前提到的 JNI 函数名称已被地址替换(0x000123...)。我没有做任何其他更改,并且已经进行了双重和三次检查,运行 withlg_prof_interval:30
让我可以看到生成的 .gif 中的函数名称,但lg_prof_interval:25
没有。
我想使用的原因lg_prof_interval:25
是因为我需要使用遭受内存泄漏的应用程序的精简版本重新运行分析,但我担心使用 2^30 字节将永远需要,因此永远不会看到 .heap文件。
我见过类似的问题,答案建议安装 dbg 版本的 jdk,但我很难理解为什么这可能是我的情况的原因。
提前谢谢了。
TLDR:可以看到函数名称,lg_prof_interval:30
但不能lg_prof_interval:25
我已经安装jemalloc
并遵循了所有指南,但它看起来不像ruby
是在使用它:
$ apt install libjemalloc2
$ ls -la /usr/lib/x86_64-linux-gnu/libjemalloc.so.2
-rw-r--r-- 1 root root xxxxxx Feb 23 2019 /usr/lib/x86_64-linux-gnu/libjemalloc.so.2
$ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 irb
irb(main):001:0> puts RbConfig::CONFIG['LIBS']
-lm
irb(main):002:0> puts RbConfig::CONFIG['MAINLIBS']
-lz -lpthread -lrt -lrt -lgmp -ldl -lcrypt -lm
Run Code Online (Sandbox Code Playgroud)
Ruby 3.0.0 是否需要以其他方式加载 jemalloc,该库是否在配置中的其他位置注明,或者我做错了什么?
首先,jemalloc(在我的用例中)的目的是跟踪由 JNI 调用等事件引起的本机内存分配,所以让我们开始:
大家好,我这里有一些严重的问题。我们的一个应用程序碰巧发生了内存泄漏。它位于 JNI 库中,特别是对于那些了解它的人来说 - cplex。我已经知道这一点,但自从我们的经理要求我提供证明以来,我花费了大量时间试图获得一份证明。我遇到了一个名为 jemalloc 的怪物工具(是的,我知道它不仅仅是一个工具),它应该创建“.heap ”文件,这很棒,我成功了,尽管我看不到任何方法来实际从该文件中读取任何有意义的内容,这里是示例:生成的“ .heap”文件的 PNG 图像 - 仅前几行,但看起来非常像那样
我发现还有一个名为“jeprof”的怪物,它显然可以将“ .heap”文件转换为漂亮的“ .gif” - 您所要做的就是运行这样的命令:jeprof --show_bytes --gif /path/to/jvm/bin/java jeprof*.heap > /tmp/app-profiling.gif
它应该会产生结果类似此处的示例(和描述): https: //gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/
(您需要将页面向下滚动到“JEMALLOC 来救援”部分才能看到我正在谈论的 gif 示例)。
不幸的是,除了我所包含的博客之外,关于如何实际使用它的信息几乎为零。每次我尝试使用以下命令生成该 gif 时:jeprof --show_bytes --gif java jeprof.out.14441.5.i5.heap > ../../../sheetchallenger/temp/app-profiling_14_10.gif
- 我得到以下答案,并创建一个大小为 0 字节的空 gif:
Use of uninitialized value $line in substitution (s///) at /usr/local/bin/jeprof line 3256.
http://jeprof.out.14441.5.i5.heap/pprof/symbol doesn't exist
Run Code Online (Sandbox Code Playgroud)
这是它似乎正在谈论的“jeprof”文件(我的意思是第 3256 行周围的部分):
sub CheckSymbolPage {
my $url = SymbolPageURL();
my $command = ShellEscape(@URL_FETCHER, …
Run Code Online (Sandbox Code Playgroud) 我尝试设置我的Redis服务器,执行make命令时,出现错误:“ jemalloc / jemalloc.h:制作Redis时没有这样的文件或目录”,我已经尝试了所有可以找到的步骤,例如make distclean或make MALLOC = libc。我正在CentOS上工作,正在另一台Ubuntu服务器上工作。
系统信息:Linux ec4t02229 3.10.0-514.10.2.el7.x86_64#1 SMP Fri Mar 3 00:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux
以下是我的输出,任何建议将不胜感激。
[root@ec4t02229 redis-4.0.2]# make
cd src && make all
make[1]: Entering directory `/home/fenxiaop/redis-4.0.2/src'
CC Makefile.dep
make[1]: Leaving directory `/home/fenxiaop/redis-4.0.2/src'
make[1]: Entering directory `/home/fenxiaop/redis-4.0.2/src'
rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark
(cd ../deps && make distclean)
make[2]: Entering directory `/home/fenxiaop/redis-4.0.2/deps'
(cd hiredis && make clean) > /dev/null || …
Run Code Online (Sandbox Code Playgroud) 如何在 Rails 服务器上运行的 ruby 中添加 jemalloc?我们使用 rvm 安装了 ruby。
Rails version:5.2
Ruby version:2.5.1
我试过
ruby -r rbconfig -e "puts RbConfig::CONFIG['LIBS']"
Run Code Online (Sandbox Code Playgroud)
我得到的输出为
-lpthread -lgmp -ldl -lcrypt -lm
Run Code Online (Sandbox Code Playgroud)
我看到一篇文章使用 Jemalloc 降低 Rails 应用程序的内存使用率,但它使用 rbenv