1.深入理解Linux内核OOM killer机制
2.一文深入了解Linux内核源码pdflush机制
3.linuxä¸å¦ä½çå¬è¿ç¨
4.nginx源码分析--master和worker进程模型
5.Linux内核源码解析---cgroup实现之整体架构与初始化
6.深入研究LinuxTop源码linuxtop源码
深入理解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机制。由于选择被杀死的进程算法较为简单,系统可能会直接选择占用内存最多的进程作为目标。因此,如果发现进程被Linux系统杀死,应检查是否涉及到内存管理问题,或是否存在资源需求过大的情况。
一文深入了解Linux内核源码pdflush机制
在进程安全监控中,遇到进程长时间处于不可中断的睡眠状态(D状态,超过8分钟),可能导致系统崩溃。dubbo admin 源码报错这种情况下,涉及到Linux内核的pdflush机制,即如何将内存缓存中的数据刷回磁盘。pdflush线程的数量可通过/proc/sys/vm/nr_pdflush_threads调整,范围为2到8个。
当内存不足或需要强制刷新时,脏页的刷新会通过wakeup_pdflush函数触发,该函数调用background_writeout函数进行处理。background_writeout会监控脏页数量,当超过脏数据临界值(脏背景比率,通过dirty_background_ratio调整)时,会分批刷磁盘,直到比率下降。
内核定时器也参与脏页刷新,启动wb_timer定时器,周期性地检查脏页并刷新。系统会在脏页存在超过dirty_expire_centisecs(可以通过/proc/sys/vm/dirty_expire_centisecs设置)后启动刷新。用户态的WRITE写文件操作也会触发脏页刷新,以平衡脏页比率,避免阻塞写操作。
总结系统回写脏页的三种情况:定时器触发、内存不足时分批写、写操作触发pdflush。dubbo注册源码解析关键参数包括dirty_background_ratio、dirty_expire_centisecs、dirty_ratio和dirty_writeback_centisecs,它们分别控制脏数据比例、回写时间、用户自定义回写和pdflush唤醒频率。
在大数据项目中,写入量大时,应避免依赖系统缓存自动刷回,尤其是当缓存不足以满足写入速度时,可能导致写操作阻塞。在逻辑设计时,应谨慎使用系统缓存,对于对性能要求高的场景,建议自定义缓存,同时在应用层配合使用系统缓存以优化高楼贴等特定请求的性能。预读策略是提升顺序读性能的重要手段,Linux根据文件顺序性和流水线预读进行优化,预读大小通过快速扩张过程动态调整。
最后,注意pread和pwrite在多线程io操作中的优势,以及文件描述符管理对性能的影响。在使用pread/pwrite时,linux 系统源码分析即使每个线程有自己的文件描述符,它们最终仍作用于同一inode,不会额外提升IO性能。
linuxä¸å¦ä½çå¬è¿ç¨
ä¸ãsupervise
Superviseæ¯daemontoolsçä¸ä¸ªå·¥å ·ï¼å¯ä»¥ç¨æ¥çæ§ç®¡çunixä¸çåºç¨ç¨åºè¿è¡æ åµï¼å¨åºç¨ç¨åºåºç°å¼å¸¸æ¶ï¼superviseå¯ä»¥éæ°å¯å¨æå®ç¨åºã
使ç¨ï¼
mkdir test
cd test
vim run åå ¥å¸ææ§è¡çæä½
supervise test (注æè¿éæ¯çåæ°æ¯runæ件ä¸å±çæ件夹ï¼æ¹årunç为å¯æ§è¡ chmod +x run)
äºãmonit
monitæ¯ä¸ä¸ªå°åçå¼æ¾æºç å·¥å ·æ¥ç®¡çåçæ§Unixç³»ç»ãMonitå¯ä»¥èªå¨ç»´æ¤è¿ç¨ï¼åæ¶é¿å è¿ç¨å¼å¸¸éåºç产ççé®é¢ã
ç³»ç»ï¼ monitå¯ä»¥çæ§é®é¢çåçï¼å æ¬è¿ç¨ç¶æãç³»ç»cpuè´è½½ãå åå ç¨æ åµçï¼ä¾å¦å½apacheæå¡çcpuè´è½½ä»¥åå åé¸å¼æ åµè¿é«æ¶åï¼å®ä¼éå¯apacheæå¡ã
è¿ç¨ï¼ monitå¯ä»¥çæ§å®æ¤è¿ç¨ï¼å æ¬ç³»ç»è¿ç¨ãä¾å¦å½æ个è¿è¡downæï¼å®ä¼èªå¨æ¢å¤éå¯è¯¥è¿ç¨ã
æ件系ç»ï¼Monitå¯ä»¥çæ§æ¬å°æ件ãç®å½ãæ件系ç»çååï¼å æ¬æ¶é´æ³ãæ ¡éªå¼ã大å°çååãä¾å¦ï¼å¯ä»¥çæ§æ件sha1以åmd5çå¼ï¼æ¥çæ§æ件æ¯å¦åçååã
ç½ç»ï¼monitå¯ä»¥çæ§ç½ç»è¿æ¥ï¼æ¯æTCPãUDPãUnix domain sockets以åHTTPãSMTPçã
å®æ¶èæ¬ï¼monitå¯ä»¥ç¨æ¥å®æ¶æµè¯ç¨åºåèæ¬ï¼è·åç¨åºè¾åºç»æï¼è¿èå¤ææ¯å¦æåæå ¶ä»æ åµã
å®è£ ï¼
sudo apt-get install monit
ç¼è¾é ç½®ï¼
sudo vim /etc/monit/monitrc
å¯å¨ãåæ¢ãéå¯ï¼
sudo /etc/init.d/monit start
sudo /etc/init.d/monit stop
sudo /etc/init.d/monit restart
设置页é¢çæ§ç¶æï¼
set mand=python /root/test_supervisor.py
process_name=%(program_name)s
stdout_logfile=/root/test.log
stderr_logfile=/root/test.log
ä¿åï¼å¯å¨ï¼
/usr/bin/supervisord -c /etc/supervisord.conf
nginx源码分析--master和worker进程模型
一、Nginx整体架构
正常执行中的nginx会有多个进程,其中最基本的是master process(主进程)和worker process(工作进程),还可能包括cache相关进程。
二、核心进程模型
启动nginx的主进程将充当监控进程,主进程通过fork()产生的子进程则充当工作进程。
Nginx也支持单进程模型,此时主进程即是工作进程,不包含监控进程。
核心进程模型框图如下:
master进程
监控进程作为整个进程组与用户的交互接口,负责监护进程,不处理网络事件,不负责业务执行,仅通过管理worker进程实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
master进程通过sigsuspend()函数调用大部分时间处于挂起状态,直到接收到信号。
master进程通过检查7个标志位来决定ngx_master_process_cycle方法的运行:
sig_atomic_t ngx_reap;
sig_atomic_t ngx_terminate;
sig_atomic_t ngx_quit;
sig_atomic_t ngx_reconfigure;
sig_atomic_t ngx_reopen;
sig_atomic_t ngx_change_binary;
sig_atomic_t ngx_noaccept;
进程中接收到的信号对Nginx框架的意义:
还有一个标志位:ngx_restart,仅在master工作流程中作为标志位使用,与信号无关。
核心代码(ngx_process_cycle.c):
ngx_start_worker_processes函数:
worker进程
worker进程主要负责具体任务逻辑,主要关注与客户端或后端真实服务器之间的数据可读/可写等I/O交互事件,因此工作进程的阻塞点在select()、epoll_wait()等I/O多路复用函数调用处,等待数据可读/写事件。也可能被新收到的进程信号中断。
master进程如何通知worker进程进行某些工作?采用的是信号。
当收到信号时,信号处理函数ngx_signal_handler()会执行。
对于worker进程的工作方法ngx_worker_process_cycle,它主要关注4个全局标志位:
sig_atomic_t ngx_terminate;//强制关闭进程
sig_atomic_t ngx_quit;//优雅地关闭进程(有唯一一段代码会设置它,就是接受到QUIT信号。ngx_quit只有在首次设置为1时,才会将ngx_exiting置为1)
ngx_uint_t ngx_exiting;//退出进程标志位
sig_atomic_t ngx_reopen;//重新打开所有文件
其中ngx_terminate、ngx_quit、ngx_reopen都将由ngx_signal_handler根据接收到的信号来设置。ngx_exiting标志位仅由ngx_worker_cycle方法在退出时作为标志位使用。
核心代码(ngx_process_cycle.c):
Linux内核源码解析---cgroup实现之整体架构与初始化
cgroup在年由Google工程师开发,于年被融入Linux 2.6.内核。它旨在管理不同进程组,监控一组进程的行为和资源分配,是Docker和Kubernetes的基石,同时也被高版本内核中的LXC技术所使用。本文基于最早融入内核中的代码进行深入分析。
理解cgroup的核心,首先需要掌握其内部的常用术语,如子系统、层级、cgroupfs_root、cgroup、css_set、cgroup_subsys_state、cg_cgroup_link等。子系统负责控制不同进程的行为,例如CPU子系统可以控制一组进程在CPU上执行的时间占比。层级在内核中表示为cgroupfs_root,一个层级控制一批进程,层级内部绑定一个或多个子系统,每个进程只能在一个层级中存在,但一个进程可以被多个层级管理。cgroup以树形结构组织,每一棵树对应一个层级,层级内部可以关联一个或多个子系统。
每个层级内部包含的节点代表一个cgroup,进程结构体内部包含一个css_set,用于找到控制该进程的所有cgroup,多个进程可以共用一个css_set。cgroup_subsys_state用于保存一系列子系统,数组中的每一个元素都是cgroup_subsys_state。cg_cgroup_link收集不同层级的cgroup和css_set,通过该结构可以找到与之关联的进程。
了解了这些概念后,可以进一步探索cgroup内部用于结构转换的函数,如task_subsys_state、find_existing_css_set等,这些函数帮助理解cgroup的内部运作。此外,cgroup_init_early和cgroup_init函数是初始化cgroup的关键步骤,它们负责初始化rootnode和子系统的数组,为cgroup的使用做准备。
最后,需要明确Linux内一切皆文件,cgroup基于VFS实现。内核启动时进行初始化,以确保系统能够正确管理进程资源。cgroup的初始化过程分为早期初始化和常规初始化,其中早期初始化用于准备cpuset和CPU子系统,确保它们在系统运行时能够正常工作。通过这些步骤,我们可以深入理解cgroup如何在Linux内核中实现资源管理和进程控制。
深入研究LinuxTop源码linuxtop源码
Linux Top源码是一款Linux系统的系统性能实时监控工具,能够实时显示机器各个进程的耗费情况,帮助开发者更加快速准确地定位性能问题。要对Linux Top源码进行深入研究,首先要明确源码的结构。它的源码大致分为如下几个部分:
(1)文件系统框架:主要完成Linux Top源码的架构,文件夹管理,内核操作,支持等功能,相当于源码的“能力支持”层;
(2)核心逻辑:主要负责Linux Top源码的运行逻辑,要对所有进程的状态和负载进行实时统计,并进行有效管理,完成Linux Top源码的基本功能;
(3)视图层:主要负责收集到的数据的展示和用户交互功能,比如分类显示,排序,设置,搜索以及警报等功能;
(4)其他工具:负责对Linux Top源码的其他辅助功能,比如日志记录,安全保护,文件系统维护等等。
接下来要进行深入的研究就需要着手梳理源码,主要从以下几个方面进行:
(1)源码功能分析:根据源码分析功能模块,明确模块之间的相互依赖和权限控制,充分利用模块划分,清晰表达源码整体逻辑;
(2)源码流程分析:梳理出源码中所有重要流程,比如获取运行状态流程,处理数据流程,显示数据流程等等,然后进行优化;
(3)源码语义分析:通过性能测试和弱当性分析,确定源码的执行有效性,可以在代码中加入合理的日志,错误检查和解除和文档等;
(4)兼容检测:在上一步确定有效性之后,需要对Linux Top源码进行兼容检测,并保证其在不同系统环境下的运行有效性。
以上就是本次对Linux Top源码的深入研究的介绍,仅通过以上步骤并不能深入了解Linux Top源码的精髓,所以在实践中,还需要根据实际需求结合代码编写优化源码,最终达到开发者的要求为止。