一直以来 go 的 runtime 在释放内存返回到内核时,在 Linux 上使用的是 MADV_DONTNEED,虽然效率比较低,但是会让 RSS(resident set size 常驻内存集)数量下降得很快。不过在 go 1.12 里专门针对这个做了优化,runtime 在释放内存时,使用了更加高效的 MADV_FREE 而不是之前的 MADV_DONTNEED。具体可以参考这里:
本来,写了个智能抠图的接口,本地运行正常,结果部署到服务器,发现,各种失败或服务器错误,查看log日志发现是本kill了
偶然在生产上部署了一个版本之后发现,机器不断重启报警,后经过查询linux日志发现,原来是因为服务占用内存过高被内核给kill掉了。接下来就是查问题,本来以为是内存泄漏,上了pprof工具之后发现,内存占用稳定在2.6g,而top命令则很快看到RES参数暴涨到12g+(机器内存16g)后被内核杀掉。百思不得其解。后来在翻阅Go1.12发布说明时看到一段话:
Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
无论您是 DevOps 工程师、系统管理员还是刚入门 Kubernetes 的人,了解内存指标可能会改变游戏规则。
值此七夕佳节,烟哥放弃了无数妹纸的邀约,坐在电脑面前码字,就是为了给读者带来新的知识,这是一件伟大的事业! 好吧,实际情况是没人约。为了化解尴尬,我决定卖力写文章,嗯,一定是我过于屌丝! 好了,开始说重点。今天讲的这个问题
使用ps命令查看进程的内存使用情况时,有3列输出,分别是%MEM、VSZ和RSS,其中VSZ全称为Virtual Memory Size,RSS全称为Resident Set Size,而MEM则是RSS占全部内存的百分比。
在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程。本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volatility。volatility的介绍不会太深入,内存取证这部分的研究还需要继续。
问题背景:一次启动本地应用,两分钟过后自动退出,通过日志并未发现任何异常状况,莫名其妙的应用就自动被杀掉了;
Docker 是一个能让程序跑在一个它无法感知的、用于隔绝外界环境里的容器的工具。
1. rx-checksumming:校验接收报文的checksum。
这件事是真实的发送在我们的生产环境上,其中的一台服务器上跑着 4 个 jar 程序,隔三差五的会发送进程突然消失的问题。
mm_struct 结构体 在 Linux 源码 linux-4.12\include\linux\mm_types.h#359 位置 ;
pidstat命令用来监控被Linux内核管理的独立任务(进程)。它输出每个受内核管理的任务的相关信息。pidstat命令也可以用来监控特定进程的子进程。间隔参数用于指定每次报告间的时间间隔。它的值为0(或者没有参数)说明进程的统计数据的时间是从系统启动开始计算的。
不知不觉,Rust1.0发布已经四周年了。 Rust 1.0是2015年5月15号发布。所以,四年了,大家学会Rust了吗?
那个傻子是不是疯了?不知道作为所谓的“技术”人员,大家是如何面对的,如何解决?本文将聚焦于 Linux 内存结构、内存分析以及 OOM killer 等 3 个方面以及笔者多年的实践经验总结进行“吹牛逼”,当然,若吹的不好,欢迎大家扔砖、鸡蛋。
上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存在用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工程师常面对的问题。
exit是c语言的库函数,他最终调用_exit。在此之前,先清洗标准输出的缓存,调用用atexit注册的函数等, 在c语言的main函数中调用return就等价于调用exit。
导语:STGW作为公司七层接入网关,在云和自研业务中承担多种网络协议接入与转发的功能,由于业务数量庞大、接入形式多样、网络环境复杂,会遇到一些很有挑战的疑难杂症。某次业务出现了流量突然下降,此时用户侧也有延迟上升和重试增多的问题。在团队自研的秒级监控助力下,我们从CPU软中断热点入手追查,发现了内核listen port哈希机制存在消耗过高问题,但热点只出现在部分核心上,接着在网卡多队列、内核Receive Packet Steering(RPS)上发现了负载均衡策略的缺陷,找出最终原因后我们在硬件和
这个文件记录着比较详细的内存配置信息,使用 cat /proc/meminfo 查看。
来自Linux内核文档。之前看过这篇文章,一直好奇,问什么一条网络流会固定在一个CPU上进行处理,本文档可以解决这个疑问。为了更好地理解本文章中的功能,将这篇文章穿插入内。
The OOM Killer 是内核中的一个进程,当系统出现严重内存不足时,它就会启用自己的算法去选择某一个进程并杀掉. 之所以会发生这种情况,是因为Linux内核在给某个进程分配内存时,会比进程申请的内存多分配一些. 这是为了保证进程在真正使用的时候有足够的内存,因为进程在申请内存后并不一定立即使用,当真正使用的时候,可能部分内存已经被回收了。
这个问题不止一个同学遇到过了,之前小王同学也遇到这个问题,内存的计算总是一个迷糊账。我们今天来把它算个清楚下!
这是一篇个人认为非常非常厉害的文章,取自这里。讲述了如何提升UDP流的处理速率,但实际涉及的技术点不仅仅限于UDP。这篇文章中涉及的技术正好可以把前段时间了解的知识串联起来。作者:Toshiaki Makita
普通的进程 , 包含 内核虚拟地址空间 和 用户虚拟地址空间 , 其中 内核虚拟地址空间 所有进程共享 , 用户虚拟地址空间 由进程独立拥有 ;
大概在十多年前,我当时还是一个产品经理。由于一些工作的原因,需要向运维工程师学习一些linux常用命令。当使用linux ps这个十分常用的命令时,遇到了一个小小的疑惑。有些工程师推荐使用ps aux的命令组合,有些工程师推荐使用ps -aux的命令组合,从输出结果上来看似乎也没有什么不同。考虑到如常用的ls -l命令在内,很多linux命令选项前都要加上一个短横线,这么来看似乎ps -axu是正确的。但是一些早期的linux版本,在执行ps -axu时又会报出如下错误Warning: bad syntax,而ps aux却没有这样的报错信息,这么看来似乎ps aux又是正确的。查阅市面上的一些linux书籍,在介绍linux ps命令示例时,有些说用ps aux,而有些又说用ps -axu。实在是让我这个初学者摸不着头脑。
/proc/meminfo是了解Linux系统内存使用状况的主要接口,我们最常用的”free”、”vmstat”等命令就是通过它获取数据的 ,/proc/meminfo所包含的信息比”free”等命令要丰富得多,然而真正理解它并不容易,比如我们知道”Cached”统计的是文件缓存页,manpage上说是“In-memory cache for files read from the disk (the page cache)”,那为什么它不等于[Active(file)+Inactive(file)]?AnonHugePages与AnonPages、HugePages_Total有什么联系和区别?很多细节在手册中并没有讲清楚,本文对此做了一点探究。
「 原谅和忘记就意味着扔掉了我们获得的最贵经验 -------《人生的智慧》叔本华」
本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的。为了理解OOM参数,第二章简单的描述什么是OOM。如果这个名词对你毫无压力,你可以直接进入第三章,这一章是描述具体的参数的,除了描述具体的参数,我们引用了一些具体的内核代码,本文的代码来自4.0内核,如果有兴趣,可以结合代码阅读,为了缩减篇幅,文章中的代码都是删减版本的。按照惯例,最后一章是参考文献,本文的参考文献都是来自linux内核的Documentation目录,该目录下有大量的文档可以参考,每一篇都值得细细品味。
Perfetto 是一个用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用程序级跟踪的服务和库、本机 + java 堆分析、使用 SQL 分析跟踪的库以及用于可视化和探索多 GB 跟踪的基于 Web 的 UI。
前段时间,我在准备面试的时搜到的一套Linux运维工程师面试题,感觉比较全面,一直保存在草稿,刚在整理后台时翻了出来,干脆就发出来好了,以备不时之需。 1.linux如何挂在windows下的共享目录 mount.cifs //192.168.1.3/server /mnt/server -o user=administrator,pass=123456 linux 下的server需要自己手动建一个 后面的user与pass 是windows主机的账号和密码 注意空格 和逗号 2.查看http的并发请
之前文章《Linux服务器性能评估与优化(一)》太长,阅读不方便,因此拆分成系列博文:
业务在上容器云的过程中发现容器不知原因被重建,查看message信息可以看到当 oom_score_adj配置为1,对应score值为0的进程杀完后如果系统还是触发oom时就开始杀pause进程。
Linux 内核是根据 GNU GPL 版本2发布的,因此是自由软件基金会定义的自由软件。
理解硬件访问内存的原理,MMU和页表;澄清Linux内核ZONE,buddy,slab管理;澄清用户空间malloc与内核关系,Lazy分配机制;澄清进程的内存消耗的vss,rss,pss,uss概念;澄清内存耗尽的OOM行为;澄清文件背景页面与匿名页,page cache与swap;澄清内存的回收、dirty page的写回,以及一些内存管理/proc/sys/vm sysctl配置的幕后原理;DMA和cache一致性,IOMMU等;给出一些内存相关的调试和优化方法;消除网上各种免费资料的各种误解。
大家好,我是山月。本篇文章帮你了解一些在裸机上的命令以及如何查看指标。本篇文章正在参加掘金的征文活动,大家可以在原文中打开地址给我点个赞。
Linux 操作系统中的 " 堆内存 “ 是通过 malloc 等函数 ” 动态分配 " 的 内存区域 ;
我在多年的工程生涯中发现很多工程师碰到一个共性的问题:Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU、内存资源等的真正分布,具体的工作机制,这使得他们对很多问题的分析都摸不到方向。比如进程的调度延时是多少?Linux能否硬实时?多核下多线程如何执行?系统的内存究竟耗到哪里去了?我写的应用程序究竟耗了多少内存?什么是内存泄漏,如何判定内存是否真的泄漏?CPU速度、内存大小和系统性能的关联究竟是什么?内存和I/O存在着怎样的千丝万缕的联系?
问题:我想要监测Linux系统的内存使用状况。有哪些可用的图形界面或者命令行工具来检查当前内存使用情况?
笔者团队发现现网服务负载即将达到瓶颈,但cpu利用率并未达到瓶颈,基于充分利用机器资源的考量,研发同学提出:“降低nginx worker数,腾出一部分内存,随后提高业务程序worker数,从而提升业务处理能力”的解决方案。
Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起。(所依据的代码是2.6.32.60) 无论是内核线程还是用户进程,对于内核来说,无非都是task_struct这个数据结构的一个实例而已,task_struct被称为进程描述符(process descriptor),因为它记录了这个进程所有的context。其中有一个被称为'内存描述符‘(memory descriptor)的数据结构mm_struct,抽象并描述了Linux视角下管理进程地址空间的所有信息。 mm_s
本文主要分析 Linux 系统内存统计的一些指标以及进程角度内存使用监控的一些方法。
在Linux内核,对于进程的内存使用与Cgroup的内存使用统计有一些相同和不同的地方。
内存是计算机中与CPU进行沟通的桥梁,用于暂时存放CPU中的运算数据。Linux 内核的内存管理机制设计得非常精妙,对于 Linux 内核的性能有很大影响。在早期的 Unix 系统中,fork 启动新进程时,由于从父进程往子进程复制内存信息需要消耗一定的时间,因此启动多个进程时存在性能瓶颈。现在的 Linux 内核则通过“写时复制(copy-on-write)”等机制提高了创建进程的效率;也正是因为这个原因,关于 Linux 内存分配、计算、空闲判断有一些特别的地方需要注意。
Linux 系统中有 5 种常见的进程状态,分别为 运行、中断、不可中断、僵死、停止。其含义如下:
Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
内核使用cgroup对进程进行分组,并限制进程资源和对进程进行跟踪。内核通过名为cgroupfs类型的虚拟文件系统来提供cgroup功能接口。cgroup有如下2个概念:
领取专属 10元无门槛券
手把手带您无忧上云