当前位置: 首页 > 网络应用技术

压力测试后,进行服务记忆手术并进行记忆回收策略解决方案想法

时间:2023-03-05 22:05:17 网络应用技术

  该服务是在启动服务之前进行的。在压力测试之后,发现该过程的记忆力很长。它被认为是内存泄漏。根据内存泄漏调查(PPROF操作),但发现服务中使用的内存不是很高,那么回收内存到哪里?为什么显示RSS值?阅读本文的问题。

  我选择了4核8G机器压力测试。发现压力测试后,CPU利用率已下降,但是记忆使用量已稳定在约3G(如下记忆使用率中所示),然后根据Pprofofailsy的堆积结构,发现它发现它这些部分只有不到一百兆。这些部分形成了非常明显的对比,这曾经使我们怀疑该密码是否泄漏了。

  压力测试结束后的杂物记忆图:

  压力测试结束后PPROF导出的堆结构:

  我发现,由于此问题的复制稳定稳定,所以我在此处为代码添加了一些打印,单独使用goroutine,运行循环,并在一定时间调用以下功能,以将版本打印到操作系统上字节数。

  发现在压力测试期间,大量释放的价值实际上基本上保持了平衡趋势的稳定向上趋势。这证明该服务已将内存返回操作系统。RES并未减少。但是,Alloc值最终在大约数十兆头的情况下稳定,这证明了该过程保留并且尚未发布。减少了内存块。然后驳斥存在问题。实际发布已发布,但是该程序不再有用。内存的内存在哪里?

  发现这两个持续的压力测试没有发现记忆继续增加,而是保持在相对稳定的高度。从这一点开始,可以看出没有内存泄漏。毕竟,如果应观察到内存泄漏,则该过程的内部存在继续上升。从这里可以猜测,发行版的发布应在中间层,进行运行时,在系统操作系统之间进行运行时间,当您看到此过程时,您必须了解GO的内存回收策略,以便准确地分析该策略问题。

  对于前三个触发器,它们最终将属于这种方法。对于不同的平台,有不同的实现。在这里,我们主要关注Linux实施MEM_LINUX.GO.GO..GO..GO..GO.GO。该功能中有一个核心调用,该函数主要帮助我们管理系统内存,例如分配,发布等等。查看特定逻辑:

  该代码中有两个值,需要注意它。从一般来看,我们可以知道这两个值应该是释放内存的两种策略。根据注释,仅在Linux内核版本4.5或更多版本上只能生效,否则它将返回到return.to retreat to Call。在这里,我们可以查看特定文档以了解这两个参数的含义。

  在压力测试之后,两个操作指令的选择是不同的,这将导致监视视图显示不同的结果。MADV_FREE将导致该过程RSS在峰值上保持稳定,RSS将不会立即发布,MADV_DONTNEED将导致该过程RSS明显明显。在GO1.12之前,默认选择的MADV_DONTNEED策略用于回收内存。您可以参考版本1.11.9。

  这里有太多的人可以更改为MADV_FRE策略,这使许多用户通过某些监视工具正常地分析内存职业。许多人认为他们的服务已经泄漏了内存。如果您有兴趣,您可以查看相关问题。

  使用MADV_DONTNEED回收策略,RSS将在短时间内下降。这很适合测试。在这里,您不会补充相关的测试用例。madvdontneed= 1,您可以尽快得到结论,如下图所示:

  我主要想在此处验证MADV_FREE。如果内核感觉到内存压力,则该过程的RSS将下降并由内核分配给其他使用过程(也就是说,实际上用MADV_FREE标记的内存块不再属于Togo Runtime)。

  编写一个简单的代码以分配内存空间的一部分,并手动调用FreeoSmory以发布以前应用的内存:

  在16G服务器上运行此代码,选择一个合理的参数最大值,分配约12G的居民内存(假设这是进程a),然后使用另一个进程B连续分配内存,尝试触发内核回收存储器A结果,A过程的RSS确实会减少,并且还证明MADV_FREE只有当内核感觉到内存压力并将其分配给其他过程时,才会恢复这些标记内存wayuse)此特征。如下图所示:一个过程从最初的11.8G RSS降至最后6.9G。实际上,其余的6G也可以由其他过程使用。

  因此,这里没有内存泄漏,但是我达到了特殊的内存回收策略。检查后,压力测试服务器内核版本为4.14,golang编译的版本为1.15.10,刚刚达到了Linux的默认MADV_FREE回收策略。优点是它可以相对改善过程的性能并减少内存的分布。缺点是它可能会引起一些误导。RSS不能迅速掉落,认为内存泄漏发生。

  最后,回答开头提到的两个问题。实际上,它可以总结为一个问题:

  为什么显示RSS值?由MADV_FREE回收的内存仅仅是页面上的标记,并且在实际意义上不会返回OS。

  由于该页面未通过OS恢复,并且仍包含在过程的过程中,因此该过程的内存占用似乎相对较大,但实际上,运行时没有保留这些内存。

  PS:当然,在哪种方法中选择回收内存的方法,我个人认为最好是MADV_FREE,因为通过在页面表中进行标记的方法,延迟分布和回收记忆可以提高内存管理效率

  作者:Marsjhe的版权属于作者。