1.linuxä¸å¦ä½çå¬è¿ç¨
2.代码 | C语言根据可执行文件名获取进程运行信息
3.一文深入了解Linux内核源码pdflush机制
4.Linux内核源码解析---cgroup实现之整体架构与初始化
5.一文分析Linux内核OOM机制(值得收藏)
6.nginx源码分析--master和worker进程模型
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
代码 | C语言根据可执行文件名获取进程运行信息
通过C语言,根据可执行文件名获取进程运行信息的源码源码代码示例如下。本文提供3年嵌入式物联网学习资源,进程监控进程监控包括C语言、源码源码Linux开发、进程监控进程监控数据结构等内容,源码源码源码安装qemu以及软件开发、进程监控进程监控STM单片机、源码源码ARM硬件开发、进程监控进程监控物联网通信开发、源码源码综合项目开发教程资料,进程监控进程监控同时附带笔试面试真题。源码源码
以下是进程监控进程监控程序源码的主要部分:
main.c文件:
proc_info.c文件:
proc_info.h文件:
进行编译时,由于使用了线程功能,源码源码需要链接pthread库。进程监控进程监控
测试结果显示,通过此代码,可以获取到线程数、虚拟内存占用大小、物理内存占用大小、进程PID、CPU占用率和进程启动次数等信息。
原文链接:mp.weixin.qq.com/s/oXlv...
转载自:嵌入式大杂烩
文章来源于:blog.csdn.net/fangye...
原文链接:代码 | C语言根据可执行文件名获取进程运行信息
版权声明:本文源自网络,旨在免费分享知识,尊重原作者版权,如涉及作品版权问题,请联系删除。解读hashmap源码
一文深入了解Linux内核源码pdflush机制
在进程安全监控中,遇到进程长时间处于不可中断的睡眠状态(D状态,超过8分钟),可能导致系统崩溃。这种情况下,涉及到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。关键参数包括dirty_background_ratio、dirty_expire_centisecs、dirty_ratio和dirty_writeback_centisecs,它们分别控制脏数据比例、回写时间、用户自定义回写和pdflush唤醒频率。
在大数据项目中,写入量大时,应避免依赖系统缓存自动刷回,尤其是当缓存不足以满足写入速度时,可能导致写操作阻塞。在逻辑设计时,应谨慎使用系统缓存,对于对性能要求高的场景,建议自定义缓存,同时在应用层配合使用系统缓存以优化高楼贴等特定请求的性能。预读策略是提升顺序读性能的重要手段,Linux根据文件顺序性和流水线预读进行优化,预读大小通过快速扩张过程动态调整。
最后,注意pread和pwrite在多线程io操作中的优势,以及文件描述符管理对性能的影响。在使用pread/pwrite时,即使每个线程有自己的文件描述符,它们最终仍作用于同一inode,Mokee源码适配不会额外提升IO性能。
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以树形结构组织,每一棵树对应一个层级,windows屏保源码层级内部可以关联一个或多个子系统。
每个层级内部包含的节点代表一个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内核中实现资源管理和进程控制。
一文分析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,以便在必要时进行系统重启或保护关键进程。
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):
如何保护源代码,防止其泄露、扩散。有什么源代码保护软件没有?
1、源代码加密保护防泄密软件推荐使用德人合科技加密软件,是一套从源头上保障数据安全和使用安全的软件系统。采用的是文件透明加密模块,对平常办公使用是没有影响的。而且支持与SVN等源代码管理工具无缝结合。在不改变研发人员原有工作习惯和工作流程的情况下,对EditPlus、Notepad++、ultraEdit、Eclipse、MyEclipse、 Keil、Visusl
studio等源代码开发工具,以及CAM、PADS、Altium
Designer、Cadence、MentorGraphics等电路设计软件进行受控加密保护。源代码文件加密后,不影响软件的正常编译,合法用户正常双击打开,在授权范围内使用。
2、如果企业内部SVN服务器采取透明模式,即加密文件是可以存放在SVN服务器上的,需要达到的效果是SVN服务器上文件密文存储。则配合应用服务器安全接入系统来实现只有安装了加密客户端的Windows、Linux、MAC端才能够正常的访问公司内部的SVN服务器。
3、如果企业内部采用eclipse、VS等开发工具,从这些开发工具将代码直接上传到SVN服务器上时会自动解密。为了避免明文、密文混乱存放导致版本比对时出现错误等问题。因此,SVN服务器上需统一存放明文文件。则通过服务器白名单功能实现对终端电脑数据进行强制透明加密,对上传到应用服务器数据实现上传自动解密、下载自动加密。
4、再配合应用服务器安全接入系统实现只有安装了加密客户端的Windows、Linux、MAC端才能够正常的访问公司内部的SVN服务器。