我想计算单个进程的内存使用情况.经过一些研究后,我遇到了smaps和statm.
首先是什么是smaps和statm?有什么不同?
statm有一个字段RSS和smaps我总结了所有的RSS值.但是这些值对于同一过程是不同的.我知道statm措施在页面中.为了进行比较,我将该值转换为kb,如在smaps中.但这些价值观并不平等.为什么这两个值不同,即使它们代表同一过程的rss值?
statm
232214 80703 7168 27 0 161967 0 (measured in pages, pages size is 4096)
smaps
Rss 1956
Run Code Online (Sandbox Code Playgroud)
我的目标是计算单个进程的内存使用情况.我对两个价值观感兴趣.USS和PSS.我可以通过使用smaps来获得这两个值吗?这个价值是否正确?另外,我想以百分比形式返回该值.
我们在云服务器上运行了一个 Nodejs 服务,只给它 512MB RAM(对于应用程序来说绰绰有余)。
服务器的内存使用量缓慢增长。当读取到512MB内存限制时,服务器会自动重新启动。
我尝试通过大量负载测试来读取内存使用统计信息,该数字显示缓慢增长rss memory usage
,但非常稳定低heap memory usage
。
我尝试过--max_old_space_size
,但这只会限制堆大小,这对我来说从来都不是问题。堆大小读取始终低于 50MB。
有办法限制rss memory size
吗?
rss
一些快速研究表明和之间的区别heap
是 C++ 代码的缓冲区大小。不确定是否可以调试它们(gdb?)。
有人说 v8 有 1.4GB 的限制,这也是堆大小限制吗?如果是rss限制,也许我可以修改nodejs源代码,构建一个限制更小的特殊版本?
我--expose-gc
经常尝试清理GC,但同样,这只有助于堆使用(并减慢它的速度)。
更新:找到了原因,RSS 使用量不断增长是由于我们使用的库之一的 C++ 内存泄漏(谢谢bignum
)。避免使用它可以保持 rss 内存稳定。
我正在 java 8 上运行不同 jvm 选项的实验,以降低 RSS:
用于 Rss 跟踪的脚本:
ps -o rss -o vsz -o pid $pid
用于设置 Java 进程的 JVM 参数:
-XX:+PrintNMTStatistics -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=detail
使用 jcmd 获取基线:
jcmd $pid VM.native_memory baseline
使用 jcmd 获取差异:
jcmd $pid VM.native_memory summary.diff
输出(部分线程区域):
- Thread (reserved=130696KB -21564KB, committed=130696KB -21564KB)
(thread #121 -21)
(stack: reserved=130048KB -21504KB, committed=130048KB -21504KB)
(malloc=379KB -67KB #610 -105)
(arena=268KB +7 #240 -42)
Run Code Online (Sandbox Code Playgroud)
问题:上面输出的 RSS 将考虑什么内存,是committed
还是reserved
?
我正在使用 Java 的罗马库来解析一些 RSS。默认情况下,它需要 25 个条目。
请告诉我,如何获得接下来的 25 个条目?
我的测试代码是:
public static SyndFeed getSyndFeedForUrl(String url) throws Exception {
SyndFeed feed = null;
InputStream is = null;
try {
URLConnection openConnection = new URL(url).openConnection();
is = new URL(url).openConnection().getInputStream();
if("gzip".equals(openConnection.getContentEncoding())){
is = new GZIPInputStream(is);
}
InputSource source = new InputSource(is);
SyndFeedInput input = new SyndFeedInput();
feed = input.build(source);
} catch (Exception e){
e.printStackTrace();
} finally {
if( is != null) is.close();
}
return feed;
}
public static void main(String[] args) {
SyndFeed …
Run Code Online (Sandbox Code Playgroud)