【电子杂志php源码】【QQ音乐钓鱼源码】【cryengine2源码】pstree源码
1.Linux性能优化之CPU使用率
2.linuxä¸å¦ä½çå¬è¿ç¨
3.Nginx - 深入理解nginx的源码处理请求、进程关系和配置文件重载
4.线程优先级最高和最低线程优先级linux
5.从根上理解IO等待—案例篇
6.Linux进程和线程的源码基础与管理
Linux性能优化之CPU使用率
CPU 使用率是衡量 CPU 工作负载的指标,通过百分比显示。源码主要命令用于查看此指标包括 top 和 ps。源码top 呈现所有 CPU 的源码平均使用率,输入数字1可查看每个核心的源码电子杂志php源码使用率。空白行后显示进程实时信息,源码每个进程的源码 %CPU 列表示总使用率,包括用户态和内核态。源码top 命令不细分。源码分析单进程使用率时,源码pidstat 工具适用。源码使用 pidstat 命令可间隔一秒查看进程的源码 CPU 使用率。
输出结果包含多个数据点及平均值。源码top、源码ps、pidstat 工具有助于定位 CPU 使用率高的进程。但需分析具体原因和代码。perf 工具适合此任务,它基于性能事件采样分析系统事件、内核性能及应用性能。使用 perf 分析 CPU 性能问题有 perf top 和 perf record & perf report 两种方法。perf top 实时显示 CPU 使用率最高的函数或指令,用于查找热点函数。使用界面显示采样数、事件类型和事件总数。采样数过少影响排序和百分比的参考价值。perf top 输出中,第一行包含采样数、QQ音乐钓鱼源码事件类型和事件总数。采样数需注意,过少时排序和百分比无实际意义。perf top 输出从第二行开始,包含四列数据,代表不同的含义。perf record 用于保存数据,后续使用 perf report 解析。实际使用中,通常为 perf top 和 perf record 添加 -g 参数以跟踪调用关系。
Linux内核源码分析学习资源:访问 ke.qq.com/course/...
福利加入Linux内核源码分析交流群:点击加入。群内提供了一些个人推荐的优质学习资料,包括书籍和视频,供群成员自由查阅。
案例中,代码执行过程注入死循环,导致CPU使用率达到%。通过工具分析,找到引起CPU利用率升高的代码段。案例代码生成的可执行文件名为 main。在Ubuntu系统中,执行main程序后,使用top命令查看CPU使用率。CPU2的使用率高达%,同时main进程的CPU使用率也达到%,表明系统CPU使用率升高源于main进程。使用perf命令定位具体导致CPU使用率升高的函数。通过调用关系显示,cryengine2源码发现问题在于注入死循环的函数func。使用perf工具分析CPU使用率升高原因,支持命令丰富,通过"perf help"查看所有命令,"perf help COMMAND"查看特定命令的用法。
生产工作中,可能遇到系统总体CPU使用率高但单个进程CPU使用率低的情况。分析这类问题时,可使用 pstree 和 execsnoop 工具。下文提供了安装pstree和execsnoop工具的步骤。内容转载自/s/EQdBqN3_sOHQafSUOe1k3g。
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 - 深入理解nginx的处理请求、进程关系和配置文件重载
Nginx的系统学习整理的第三篇博客,主要介绍nginx的应用场景和架构基础,以便更好的理解,再生产环境中进行性能调优。 Nginx的三个主要应用场景: 1.静态资源服务,通过本地文件系统提供服务 2.反向代理服务,强大的性能,缓存 和负载均衡服务 3.ApiServer服务,比如像php-fpm、tomcat、uwsgi等 运行中的Nginx进程间的关系: Nginx部署以后,我们首先要了解的是Nginx进程间的关系,是怎么做到处理高并发的请求的原理和实现,可以使用pstree命令查看master和worker的关系。 Nginx是支持单进程(master进程)提供服务的,那么为什么产品环境下要按照master-worker方式配置启动多个进程,分时画线源码这样做主要有两点:一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同worker进程之间处理并发请求几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,当Nginx上的进程数与CPU的核心数相等时,进程间的切换代价是最小的。
Nginx请求处理流程: Nginx可以搭建静态web服务器,反向代理服务器,对一些限流、限速的方向上是有所不同的,这些都要求我们对Nginx架构有清晰的了解,需要我们从Nginx内部看Nginx是怎样处理请求的。 当web请求或者tcp请求进入到Nginx上,Nginx内部有三个大的状态机,传输层(Tcp/Udp)状态机、Http状态机,以及处理邮件的Mall状态机,为什么要叫它状态机呢,是因为Nginx中的核心用非阻塞的事件驱动处理引擎,就是我们所说的epoll异步处理引擎以后,通常都需要使用状态机对请求进行正确处理的。 当处理静态资源的时候会有一个问题,当整个内存不足时完全缓存文件信息的时候,AIO会退换成使用线程池处理磁盘的阻塞调用。 对于每一个处理完成的请求会记录到Access访问日记和错误日志里,更多的时候Nginx作为反向代理服务器使用的,可以使用协议传输到后面的服务器,也可以通过应用层的协议,代理到响应的源码学院长沙应用服务器 配置文件重载的原理真相: 想了解配置文件重载的原理真相,需要先了解Nginx的组成,Nginx一共有四个组成部分:Nginx二进制可执行文件,由各源码编译出的一个文件;Nginx.conf配置文件,控制Nginx的行为;Access.log访问日志,记录每一条working)#3 - full multiuser mode
#4 - unused
#5 - X
#6 - reboot (do not set initdefault to this)
#
//表示当前缺省运行级别为5,启动系统进入图形化界面
id:5:initdefault:
//启动时自动执行/etc/rc.d/rc.sysinit脚本
#system initialization.
si::sysinit:/etc/rc.d/rc.sysinit
:0:wait:/etc/rc.d/rc 0
:1:wait:/etc/rc.d/rc 1
:2:wait:/etc/rc.d/rc 2
:3:wait:/etc/rc.d/rc 3
:4:wait:/etc/rc.d/rc 4
//当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回
:5:wait:/etc/rc.d/rc 5
:6:wait:/etc/rc.d/rc 6
//在启动过程中允许按[ctrl-alt-delete]重启系统
#trap ctrl-alt-delete
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
#
..................................
#
//在运行级别2、3、4、5以上ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,如果进程退出则再次运行mingetty程序
#run gettys in standard runlevels
1::respawn:/sbin/mingetty tty1
2::respawn:/sbin/mingetty tty2
3::respawn:/sbin/mingetty tty3
4::respawn:/sbin/mingetty tty4
5::respawn:/sbin/mingetty tty5
6::respawn:/sbin/mingetty tty6
//在级别5上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行
x:5:respawn:/etc/x/prefdm -nodaemon
#run xdm in runleverl 5
Inittab配置文件每行的基本格式如下。
id:runlevels:action:procees
其中某些部分可以为空,下面我们逐一介绍。
1.id
1~2个字符,配置行的惟一标识,在配置文件中不能重复。
2.runlevels
配置行适用的运行级别,在这里可填入多个运行级别,比如或者等。
Linux有7个运行级别:
0:关机
1:单用户字符界面
2:不具备网络文件系统(NFS)功能的多用户字符界面
3:具有网络功能的多用户字符界面
4:保留不用
5:具有网络功能的图形用户界面
6:重新启动系统
3.action
init有如下几种行为,如下表所示。
init行为
行为
描述
respawn
启动并监视第4项指定的process,若process终止则重启它
wait
执行第4项指定的process,并等待它执行完备
once
执行第4项指定的process
boot
不论在哪个执行等级,系统启动时都会运行第4项指定的process
bootwait
不论在哪个执行等级,系统启动时都会运行第4项指定的process,且一直等它执行完备
off
关闭任何动作,相当于忽略该配置行
ondemand
进入ondemand执行等级时,执行第4项指定的process
initdefault
系统启动后进入的执行等级,该行不需要指定process
sysinit
不论在哪个执行等级,系统会在执行boot及bootwait之前执行第4项指定的process
powerwait
当系统的供电不足时执行第4项指定的process,且一直等它执行完备
powerfailnow
当系统的供电严重不足时执行第4项指定的process
ctrlaltdel
当用户按下ctrl+alt+del 时执行的操作
kbrequest
当用户按下特殊的组合键时执行第4项指定的process,此组合键需在keymaps文件定义
4.process
Process为init执行的进程,这些进程都保存在目录/etc/rc.d/rcX中,其中的X代表运行级别,rc程序接收X参数,然后运行/etc/rc.d/rc.X下面的程序。使用如下命令可以查看/etc/rc.d目录内容。
复制代码
代码如下:
#ls –l /etc/rc.d/
total
drwxr-xr-x 2 root root 3/ : init.d
-rxwr-xr-x 1 root root -3- rc
drwxr-xr-x 2 root root 3/ : rc0.d
drwxr-xr-x 2 root root 3/ : rc1.d
drwxr-xr-x 2 root root 3/ : rc2.d
drwxr-xr-x 2 root root 3/ : rc3.d
drwxr-xr-x 2 root root 3/ : rc4.d
drwxr-xr-x 2 root root 3/ : rc5.d
drwxr-xr-x 2 root root 3/ : rc6.d
-rxwr-xr-x 1 root root -3- rc.local
-rxwr-xr-x 1 root root -3- rc.sysinit
…………
使用如下命令查看/etc/rc.d/rc5.d的内容。
复制代码
代码如下:
#ls –l /etc/rc.d/rc5.d
这些文件都是符号链接,以S打头的标识启动该程序,而以K打头的标识终止该程序,后面的数字标识执行顺序,越小越先执行,剩下的标识程序名。系统启动或者切换到该运行级别时会执行以S打头的程序,系统切换到该运行级别时会执行以K打头的程序。
这个目录下的程序可通过chkconfig程序进行管理,当然这个目录下的程序需要符合一定规范,如果了解shell编程,可以查看这些符号链接所指向的程序的源码。
init也是一个进程,和普通的进程具有一样的属性。比如修改了/etc/inittab,想让修改马上生效,可通过运行“kill-SIGHUP 1”来实现,也可通过运行“init q”来实现。
八.Linux的线程简介
1.Linux线程的定义
线程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。在两个普通进程(非线程)间进行切换时,内核准备从一个进程的上下文切换到另一个进程的上下文要花费很大的开销。这里上下文切换的主要任务是保存老进程CPU状态并加载新进程的保存状态,用新进程的内存映像替换进程的内存映像。线程允许你的进程在几个正在运行的任务之间进行切换,而不必执行前面提到的完整的上下文。另外本文介绍的线程是针对POSIX线程的,也就是Pthread。也因为Linux对它的支持最好,相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。也可以将线程和轻量级进程(LWP)视为等同的,但其实在不同的系统/实现中有不同的解释,LWP更恰当的解释为一个虚拟CPU或内核的线程。它可以帮助用户态线程实现一些特殊的功能。Pthread是一种标准化模型,它用来把一个程序分成一组能够同时执行的任务。
2.什么场合使用Pthread,即线程
(1)在返回前阻塞的I/O任务能够使用一个线程处理I/O,同时继续执行其他处理任务。
(2)在有一个或多个任务受不确定性事件,比如网络通信的可获得性影响的场合,能够使用线程处理这些异步事件,同时继续执行正常的处理。
(3)如果某些程序功能比其他的功能更重要,可以使用线程以保证所有功能都出现,但那些时间密集型的功能具有更高的优先级。
以上三点可以归纳为:在检查程序中潜在的并行性时,也就是说在要找出能够同时执行任务时使用Pthread。上面已经介绍了,Linux进程模型提供了执行多个进程的能力,已经可以进行并行或并发编程,可是纯种能够让你对多个任务的控制程序更好、使用资源更少,因为一个单一的资源,如全局变量,可以由多个线程共享。而且,在拥有多个处理器的系统上,多线程应用会比用多个进程实现的应用执行速度更快。
3.Linux进程和线程的发展
年1月发布的Linux 2.2内核中,进程是通过系统调用fork创建的,新的进程是原来进程的子进程。需要说明的是,在2.2.x版本中,不存在真正意义上的线程(thread)。Linux中常用的线程Pthread实际上是通过进程来模拟的。也就是说Linux中的线程也是通过fork创建的,是“轻”进程。Linux 2.2只默认允许个进程/线程同时运行。高端系统同时要服务上千个用户,所以这显然是一个问题,它一度是阻碍Linux进入企业级市场的一大因素。
年1月发布的Linux 2.4内核消除了这个限制,并且允许在系统运行中动态调整进程数上限。因此,进程数现在只受制于物理内存的多少。在高端服务器上,即使安装了MB内存,现在也能轻而易举地同时支持1万6千个进程。
年月发布的2.6内核,进程调度经过重新编写,去掉了以前版本中效率不高的算法。以前,为了决定下一步要运行哪一个任务,进程调度程序要查看每一个准备好的任务,并且经过计算机来决定哪一个任务相对来更为重要。进程标识号(PID)的数目也从升到亿。内核内部的大改变之一就是Linux的线程框架被重写,以使NPTL(Native POSIX Thread Library)可以运行于其上。对于运行负荷繁重的线程应用的Pentium Pro及更先进的处理器而言,这是一个主要的性能提升,也是企业级应用中的很多高端系统一直以来所期待的。线程框架的改变包含Linux线程空间中的许多新的概念,包括线程组、线程各自的本地存储区、POSIX风格信号,以及其他改变。改进后的多线程和内存管理技术有助于更好地运行大型多媒体应用软件。
4.总结
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在对称处理器的计算机上运行,而进程则可以跨机器迁移。另外,进程可以拥有资源,线程共享进程拥有的资源。进程间的切换必须保存在进程控制块PCB(Process Control Block)中。同一个进程的多个线程间的切换不用那么麻烦。最后一个实例来作为本文的结束:当你在一台Linux PC上打开两个OICQ,每一个OICQ是一个进程;而当你在一个OICQ上和多人聊天时,每一个聊天窗口就是一个线程。