1.深入理解Linux内核OOM killer机制
2.MySQL源码阅读4-do_command函数/功能类命令
3.Linux kill命令原理及C/C++源码实现
4.一文分析Linux内核OOM机制(值得收藏)
深入理解Linux内核OOM killer机制
深入理解Linux内核OOM killer机制
Linux内核中存在一个名为OOM killer的码分机制,该机制专门负责监控并处理那些在短时间内内存使用量急剧增加的码分进程,以防止系统内存耗尽导致的码分崩溃。当系统内存不足时,码分内核会调用out_of_memory()函数,码分挑选并杀掉占用内存最大的码分纯文本源码进程。挑选进程的码分算法较为直接,就是码分选择内存使用量最多的进程作为目标。此机制的码分源代码位于linux/mm/oom_kill.c文件中。
触发机制主要依赖于out_of_memory()函数的码分调用。在执行此函数之前,码分会先检查oom_killer_disabled的码分值,若其值为真,码分则不会触发OOM机制。码分oom_killer_disabled的码分值默认为0,表示开启OOM-kill功能。无论是通过何种方式申请内存,最终都会调用到alloc_page()函数,并最终调用out_of_memory()触发内存管理器的爱乐商城源码OOM机制。
当系统检测到内存不足时,会触发内核的OOM killer机制,挑选并杀死占用内存最大的进程。此过程可以通过执行egrep -i -r 'killed process' /var/log命令或dmesg命令来查看系统日志。若需要查看具体的时间戳,可以使用dmesg -T命令。
在理解了内核的内存管理机制后,我们可以分析一些进程被Linux系统杀死的可能原因。一种可能是内存泄漏,另一种可能是进程所需内存资源过大,超过了系统的供给能力。在设计进程时,应该对所需资源进行限制,避免资源无限制增长。此外,当主机上其他进程占用资源过多时,也可能导致系统内存不足,进而触发OOM killer机制。健身 ios 源码由于选择被杀死的进程算法较为简单,系统可能会直接选择占用内存最多的进程作为目标。因此,如果发现进程被Linux系统杀死,应检查是否涉及到内存管理问题,或是否存在资源需求过大的情况。
MySQL源码阅读4-do_command函数/功能类命令
do_command函数在MySQL的线程循环中执行,分为读取命令和分发执行命令两个主要步骤。
在读取命令阶段,首先设置读取超时(my_net_set_read_timeout),通过vio(Virtual I/O)接口从连接中读取数据。读取时,先解析包头,然后根据包头大小读取数据,同时检查是否超过最大包限制。若数据被压缩,使用zstd_uncompress或zlib_uncompress解压。解析数据并校验,tvb源码录制将结果存储到thd对象中。
执行命令阶段,依据获取到的命令执行逻辑,分配内存给String对象。通过dispatch_command函数,进入switch...case...结构,执行不同命令的特定逻辑。功能类命令包括初始化数据库(COM_INIT_DB)、注册从节点(COM_REGISTER_SLAVE)、重置连接(COM_RESET_CONNECTION)、克隆插件(COM_CLONE)、修改用户(COM_CHANGE_USER)等。其他类如数据操作、未实现命令则在后续阅读。
以功能类命令为例,COM_INIT_DB用于改变当前连接的默认数据库。COM_REGISTER_SLAVE则在master节点上注册从节点,启动从节点与master节点的趋势网格源码同步。COM_RESET_CONNECTION重置连接,但不创建新连接或更新授权。COM_CLONE命令用于克隆远程插件到本地,并确保一致性。COM_CHANGE_USER允许修改当前连接的用户,并重置连接。
具体操作包括解析请求包、验证、更新thd信息、保存用户连接信息、证书验证、检查密码有效期、限制最大连接数、更新schema属性等。COM_QUIT命令用于清除数据并退出循环。COM_BINLOG_DUMP_GTID和COM_BINLOG_DUMP用于请求发送binlog数据流,而COM_REFRESH命令用于刷新缓存、权限、日志、表、连接主机信息等数据。
在COM_PROCESS_INFO命令中获取进程处理信息,COM_SET_OPTION设置连接属性,COM_DEBUG触发打印调试信息,而COM_PROCESS_KILL用于终止连接。最后,检查是否具有RELOAD_ACL权限并加载数据。
本文总结了do_command函数的命令读取和执行流程,详细介绍了功能类命令的执行情况,为理解MySQL核心工作原理提供了深入洞察。
Linux kill命令原理及C/C++源码实现
在 Linux 环境中,遇到卡死的应用程序或命令行进程时,通常需要使用 kill 命令来终止。Linux 的内置命令 kill(位于 /bin/kill)用于处理这种场景,通过发送信号来告知进程需要关闭。默认情况下,kill 发送的是 TERM 信号,用于礼貌地结束进程。
信号是操作系统间进行异步通信的方式,用来通知进程某个事件。Unix和Linux系统中,如需终止进程,会发送 SIGTERM 或 SIGKILL 等信号。SIGTERM 是一种通用信号,可以被进程处理,而 SIGKILL 则是强制性的,无法被处理。
kill 命令的使用非常直观,基本语法为 "kill [选项] ",其中 pid 是要终止的进程ID。一般情况下,我们先使用 ps 命令获取进程ID,然后使用 kill 命令终止。对于权限问题,普通用户可以通过 sudo 获得 root 权限来终止其他用户或系统的进程。
源码层面,kill 命令通过向内核发送系统信号和进程标识来操作进程,而信号状态默认或忽略取决于程序的设置。例如,后台进程可能设置为忽略中断和退出信号。
理解信号和 kill 命令在 Linux 编程中的作用至关重要,特别是信号的处理方式。如果你想深入了解这方面的知识,可以关注我们的公众号程序猿编码或直接添加我微信(c)进行交流。
一文分析Linux内核OOM机制(值得收藏)
Linux内核通过过度分配内存策略,间接利用未被完全使用的内存,以提高整体内存效率。然而,当内存需求超过物理内存时,OOM killer机制会介入,通过杀掉占用内存过大的进程来保证系统运行。这就像银行面对全民取款压力时,会限制部分账户的取款。oom killer会在日志中记录操作,如"Out of Memory: Kill process (sshd)",表明sshd进程被杀以缓解内存压力。
oom killer机制针对内存占用过大且瞬间消耗的进程进行监控,通过内核源代码linux/mm/oom_kill.c中的算法,如select_bad_process()和oom_badness()来决定优先杀死哪个进程。进程的oom_score是决定因素,调整oom_adj参数可以控制进程被优先级杀掉的可能性,如将MySQL进程的oom_adj设置为-,可以降低其被杀概率。
在极端情况下,可以通过设置内核参数vm.overcommit_memory来调整内存分配策略,甚至完全禁止过度分配。此外,可以通过查看/proc/PID/oom_adj或oom_score来找出最易被oom killer杀死的进程,并进行相应的调整。需要注意,oom killer不适用于解决内存泄漏问题,且在某些旧版本的内核中,oom killer的精确性可能存在不足。
为了验证OOM机制,可以手动创建大内存占用的进程,观察其被杀死的动态过程。通过设置oom_adj参数,可以主动控制哪些进程在内存不足时被优先保护。同时,内核提供了设置来决定在内存严重不足时是直接panic还是执行oom killer,以便在必要时进行系统重启或保护关键进程。