当前位置: 首页 > news >正文

找人做网站多少钱如何用使用好wordpress

找人做网站多少钱,如何用使用好wordpress,好的免费博客网站,seo专业实战培训Linux CPU利用率 在线上服务器观察线上服务运行状态的时候#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如#xff0c;随手拿来的一台机器#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单#xff0c;说复杂也不是那么…Linux CPU利用率 在线上服务器观察线上服务运行状态的时候绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如随手拿来的一台机器top 命令显示的利用率信息如下 这个输出结果说简单也简单说复杂也不是那么容易就能全部搞明白的。例如 问题 1top 输出的利用率信息是如何计算出来的它精确吗 问题 2ni 这一列是 nice它输出的是 cpu 在处理啥时的开销 问题 3wa 代表的是 io wait那么这段时间中 cpu 到底是忙碌还是空闲 原理介绍 CPU占用率是一个非常重要的指标它反映了CPU在特定时间内的忙碌程度。 抛开Linux的实现先不谈如果有如下需求有一个四核服务器上面跑了四个进程。 让你来设计计算整个系统CPU利用率的这个需求支持像top命令这样的输出满足一下要求 cpu使用率要尽可能地准确要能体现秒级瞬时cpu状态 经过思考你会发现这个看起来很简单的需求实际还是有点小复杂的。其中一个思路是把所有进程的执行时间都加起来然后再除以系统执行总时间*4。这个思路是没问题的用这种方法统计很长一段时间内的CPU利用率是可以的统计也足够准确。 但只要用过top你就知道top输出的CPU利用率并不是长时间不变的而是默认3秒为单位会动态更新一下这个时间间隔可以使用-d设置。我们的这个方案体现总利用率可以体现这种瞬时的状态就难办了。你可能会想到那我也3秒算一次不就行了但这个3秒的时间从哪个点开始呢粒度很不好控制。 上一个思路问题核心就是如何解决瞬时问题。提到瞬时状态你可能就又来思路了。那我就用瞬时采样去看看看当前有几个核在忙。四个核中如果有两个核在忙那利用率就是50%。这个思路思考的方向也是正确的但是问题有两个 你算出的数字都是25%的整数倍这个瞬时值会导致CPU使用率显示的剧烈震荡。 比如下图 在t1的瞬时状态看来系统的CPU利用率毫无疑问就是100%但在t2时间看来使用率又编程0%。思路方向是对的但显然这种粗暴的计算无法像top命令一样优雅地工作。 我们再改进一下它把上面两个思路结合起来可能就能解决我们的问题了。在采样上我们把周期定的细一些但在计算上我们把周期定的粗一些。 我们引入采样周期的概念定时比如每1毫秒采样一次。如果采样的瞬时cpu在运行就将这1ms记录为使用这时会得出一个瞬时的cpu使用率把它都存起来。 在统计3秒内的CPU使用率的时候比如途中的t1和t2这段时间范围。那就把这段时间内的所有瞬时值全加一下取个平均值。这样就能解决上面的问题了统计相对准确避免了瞬时值剧烈震荡且粒度过粗只能以25%为单位变化的问题了。 可能有同学会问了假如cpu在两次采样中间发生变化了呢如下图这种情况 在当前采样点到来的时候进程A其实刚执行完有一点点时间既没有被上一个采样点统计到本次也统计不到。对于进程B其实只开了一小端时间把1ms全记上似乎有点多记了。 确实会存在这个问题但因为我们的采样是1ms一次而我们实际查看使用的时候最少也是秒级别地用会包括有成千上万个采样点的信息所以这种误差并不会影响我们对全局的把握。 事实上Linux也就是这样来统计系统CPU利用率的。虽然可能会有误差但作为一项统计数据使用已经是足够了的。在实现上Linux是将所有的瞬时值都累加到某一个数据上的而不是真的存了很多份的瞬时数据。 接下来就让我们进入Linux来查看它对系统CPU利用率统计的具体实现。 原始数据 上一节我们说的Linux在实现上是将瞬时值都累加到某一个数据上的这个值是内核通过/proc/stat伪文件来对用户态暴露。Linux在计算系统CPU利用率的时候用的就是它。 整体上看top命令工作的内部细节如下图所示 top命令访问/proc/stat获取各项CPU利用率使用值内核调用stat_open函数来处理对/proc/stat的访问内核访问的数据来源于kernel_cpustat数组并汇总打印输出给用户态 接下来我们把每一步都展开来详细看看。 通过使用strace跟踪top命令的各种系统调用可以看的到它对该文件的调用。 # strace top ... openat(AT_FDCWD, /proc/stat, O_RDONLY)  4 openat(AT_FDCWD, /proc/2351514/stat, O_RDONLY)  8 openat(AT_FDCWD, /proc/2393539/stat, O_RDONLY)  8 除了/proc/stat外还有各个进程细分的/proc/pid/stat是用来计算各个进程的CPU利用率时使用的。 内核为各个伪文件都定义了处理函数/proc/stat文件的处理方法是 proc_stat_operations。//file:fs/proc/stat.c staticint__init proc_stat_init( void){proc_create( stat, 0, NULL, proc_stat_operations);return0;}staticconststructfile_operationsproc_stat_operations {.open stat_open,...}; proc_stat_operations 中包含了该文件时对应的操作方法。当打开 /proc/stat 文件的时候stat_open 就会被调用到。stat_open 依次调用 single_open_sizeshow_stat 来输出数据内容。我们来看看它的代码 //file:fs/proc/stat.cstaticintshow_stat(struct seq_file *p, void*v){u64 user, nice, system, idle, iowait, irq, softirq, steal;for_each_possible_cpu(i) {structkernel_cpustat* kcs kcpustat_cpu( i);user kcs-cpustat[CPUTIME_USER];nice kcs-cpustat[CPUTIME_NICE];system kcs-cpustat[CPUTIME_SYSTEM];idle get_idle_time(kcs, i);iowait get_iowait_time(kcs, i);irq kcs-cpustat[CPUTIME_IRQ];softirq kcs-cpustat[CPUTIME_SOFTIRQ];...} //转换成节拍数并打印出来 seq_put_decimal_ull(p, cpu , nsec_to_clock_t(user));seq_put_decimal_ull(p, , nsec_to_clock_t(nice));seq_put_decimal_ull(p, , nsec_to_clock_t(system));seq_put_decimal_ull(p, , nsec_to_clock_t(idle));seq_put_decimal_ull(p, , nsec_to_clock_t(iowait));seq_put_decimal_ull(p, , nsec_to_clock_t(irq));seq_put_decimal_ull(p, , nsec_to_clock_t(softirq));...} 在上面的代码中for_each_possible_cpu 是在遍历存储着 cpu 使用率数据的 kcpustat_cpu 变量。该变量是一个 percpu 变量它为每一个逻辑核都准备了一个数组元素。里面存储着当前核所对应各种事件包括 user、nice、system、idel、iowait、irq、softirq 等。 在这个循环中将每一个核的每种使用率都加起来。最后通过 seq_put_decimal_ull 将这些数据输出出来。 注意在内核中实际每个时间记录的是纳秒数但是在输出的时候统一都转换成了节拍单位。至于节拍单位多长下一节我们介绍。总之/proc/stat的输出是从kernel_cpustat这个percpu变量中读取出来的。 我们接着再看看这个变量中的数据是何时加进来的。 统计数据怎么来的 前面我们提到内核是以采样的方式来统计cpu使用率的。这个采样周期依赖的是Linux时间子系统中的定时器。 Linux内核每隔固定周期会发出timer interrupt这有点像乐谱中的节拍的概念。每隔一段时间就打出一个拍子Linux就响应之并处理一些事情。 一个节拍的长度是多长时间是通过CONFIG_HZ来定义的。它定义的方式是每一秒有几次timer interrupts。不同的系统中这个节拍的大小可能不同通常在1ms到10ms之间。可以在自己的linux config文件中找到它的配置。 # grep ^CONFIG_HZ /boot/config-5.4.56.bsk.10-amd64 CONFIG_HZ1000 从上述结果中可以看出我的机器的每秒要打出1000次节拍。 rk3568每秒钟的节拍树为300 每次当时间中断到来的时候都会调用update_process_times来更新系统时间。更新后的时间都存储在我们前面提到的percpu变量kcpustat_cpu中。 我们来详细看下汇总过程 update_process_times 的源码它位于 kernel/time/timer.c 文件中。 //file:kernel/time/timer.cvoidupdate_process_times( intuser_tick){structtask_struct* p current;//进行时间累积处理account_process_tick(p, user_tick);...} 这个函数的参数user_tick指的是采样的瞬间是处于内核态还是用户态。接下来调用account_process_tick。 //file:kernel/sched/cputime.cvoidaccount_process_tick(struct task_struct *p, intuser_tick){cputime TICK_NSEC;...if(user_tick)//3.1 统计用户态时间account_user_time(p, cputime);elseif((p ! rq-idle) || (irq_count ! HARDIRQ_OFFSET))//3.2 统计内核态时间account_system_time(p, HARDIRQ_OFFSET, cputime);else//3.3 统计空闲时间account_idle_time(cputime);} 这 这个函数中首先设置cputimeTICK_NSEC一个TICK_NSEC的定义是一个节拍所占的纳秒数。接下俩根据判断劫夺分别执行account_user_timeaccount_system_time和account_idle_time来统计用户态、内核态和空闲时间。 用户态时间统计 3.1 用户态时间统计 //file:kernel/sched/cputime.cvoidaccount_user_time(struct task_struct *p, u64 cputime){//分两种种情况统计用户态 CPU 的使用情况intindex;index (task_nice(p) 0) ? CPUTIME_NICE : CPUTIME_USER;//将时间累积到 /proc/stat 中task_group_account_field(p, index, cputime);......} account_user_time函数主要分两种情况统计 如果进程的nice值大于0那么将会增加到cpu统计结构的nice字段中如果进程的nice值小于等于0那么增加到cpu统计结构的user字段中。 看到这里开篇的问题2就有答案了其实用户态的时间不只是user字段nice也是。之所以要把nice分出来是为了让Linux用户更一目了然地看到调过nice的进程所占的CPU周期有多少。 我们平时如果想要观察系统的用户态消耗的时间的话应该是将top中输出的user和nice加起来一并考虑而不是只看user。 接着调用task_group_acconut_field来把时间加到前面我们用到的kernel_cpustat内核变量中。 //file:kernel/sched/cputime.cstaticinlinevoidtask_group_account_field(struct task_struct *p, intindex,u64 tmp){__this_cpu_add(kernel_cpustat.cpustat[index], tmp);...} 内核态时间统计 我们再来看内核态时间是如何统计的找到account_system_time的代码。 //file:kernel/sched/cputime.cvoidaccount_system_time(struct task_struct *p, inthardirq_offset, u64 cputime){if(hardirq_count - hardirq_offset)index CPUTIME_IRQ;elseif(in_serving_softirq)index CPUTIME_SOFTIRQ;elseindex CPUTIME_SYSTEM;account_system_index_time(p, cputime, index);} 内核态的时间主要分3中情况进行统计。 如果当前处于硬中断执行上下文那么统计到irq字段中如果当前处于软中断执行上下文那么统计到softirq字段中否则统计到system字段中 判断好要加到哪个统计项中后一次调用account_system_index_time、task_group_account_field来将这段时间加到内核变量kernel_cpustat中。也就是说systemirqsoftirq等于内核态占用CPU的比率。 //file:kernel/sched/cputime.cstaticinlinevoidtask_group_account_field(struct task_struct *p, intindex,u64 tmp){__this_cpu_add(kernel_cpustat.cpustat[index], tmp);} 空闲时间的累积  每一个 CPU 核心都会有一个 idle 进程idle 进程是当系统没有调度 CPU 资源的时候会进入 idle 进程而 idle 进程的作用就是不使用 CPU以此达到省电的目的。 在ARM64架构中当CPU Idle时会调用WFI指令(wait for interrupt)关掉CPU的Clock以便降低功耗当有外设中断触发时CPU又会恢复回来。 没错在内核变量kernel_cpustat中不仅仅统计了各种用户态、内核态的使用统计空闲也一并统计起来了如果在采样的瞬间cpu既不在内核态也不在用户态的话就将当前节拍的时间都累加到idle中。 //file:kernel/sched/cputime.cvoidaccount_idle_time(u64 cputime){u64 *cpustat kcpustat_this_cpu-cpustat;structrq* rq this_rq;if(atomic_read(rq-nr_iowait) 0)cpustat[CPUTIME_IOWAIT] cputime;elsecpustat[CPUTIME_IDLE] cputime;} 在CPU空闲的情况下进一步判断是不是在等待IO例如磁盘IO如果是的话这段空闲时间会加到iowait中否则就加到idle中。从这里我们可以看懂iowait其实是cpu的空闲时间只不过是在等待IO完成而已。 看到这里开篇问题3 也有非常明确的答案了io wait其实是CPU在空闲状态的一项统计只不过这种状态和idle的区别是cpu是因为等待io而空闲。 总结 本文深入分析了Linux统计系统CPU利用率的内部原理。全文的内容可以用如下一张图来汇总 Linux中的定时器会以某个固定节拍比如1ms一次采样各个cpu核的使用情况然后将当前节拍的所有时间都累加到/user/nice/system/irq/softirq/io_wait/idle中的某一项上这些项的总和为100%。 top命令是读取的/proc/stat中输出的CPU各项利用率数据而这个数据在内核中的是根据kernel_cpustat来汇总并输出的。 回到开篇问题1top输出的利用率信息是如何计算出来的它精确吗 /proc/stat文件输出的是某个时间点的各个指标所占用的节拍树。如果想像top那样输出一个百分比计算过程是分两个时间点t1,t2分别获取一下stat文件中的相关输出然后经过个简单的算术运算便可以算出当前的CPU利用率。 #!/bin/bash#获取宿主机的 CPU 使用情况 function get_host_cpu_usage(){#内核会在/proc/stat中输出整机CPU的使用情况, 例如cat /proc/stat 输出如下#cpu 52635657 657000 57094567 7675992570 422057 0 545206 0 0 0#其中各列中的数值都是从启动到现在的累计和单位是jiffies#除了第一列外其余每列的含义分别是# 1.user用户态花费的cpu时间# 2.nice用户态在低优先级花费的cpu时间# 3.system系统态花费的cpu时间# 4.idel在空闲任务上花费的cpu时间# 5.iowait等待I/O花费的cpu时间# 6.irq硬中断花费的cpu时间# 7.softirq软中断花费的cpu时间# 8.steal系统处在虚拟化环境中你的虚拟机被其他虚拟机占用的 CPU 时间# 9.guest运行虚拟机花费的cpu时间# 10.guest_nice运行低优先级虚拟机花费的cpu时间#获取宿主机的 CPU 用量的原理是选择两个时间点#cpu总时间usersystemniceidleiowaitirqsoftirq#cpu_usage100-(idle2-idle1)/(cpu总时间2-cpu总时1)*100T1_CPU_INFO$(cat /proc/stat | grep -w cpu | awk {print $2,$3,$4,$5,$6,$7,$8})T1_IDLE$(echo $T1_CPU_INFO | awk {print $4})T1_TOTAL$(echo $T1_CPU_INFO | awk {print $1$2$3$4$5$6$7})sleep 10T2_CPU_INFO$(cat /proc/stat | grep -w cpu | awk {print $2,$3,$4,$5,$6,$7,$8})T2_IDLE$(echo $T2_CPU_INFO | awk {print $4})T2_TOTAL$(echo $T2_CPU_INFO | awk {print $1$2$3$4$5$6$7})CPU_UTILIZATIONecho ${T1_IDLE} ${T1_TOTAL} ${T2_IDLE} ${T2_TOTAL}| awk {printf %.2f, (1-($3-$1)/($4-$2))*100}echo Host CPU Utiliztion:${CPU_UTILIZATION}% }get_host_cpu_usage 再说是否准确这个统计方法是采样的只要是采样肯定就不是百分之百精确。但由于我们查看CPU使用率的时候往往都是计算1秒甚至更长一段时间的使用情况这其中会包含很多采样点所以查看整体情况问题是不大的。 另外从本文我们也学到了top中输出的CPU的时间项目其实大致可以分为三类: 第一类用户态消耗时间。包括user和nice。如果想看用户态的消耗要将user和nice加起来看才对。 第二类内核态消耗时间。包括irq, softirq和system; 第三类空闲时间包括io_wait和idle。其中io_wait也是cpu的空闲状态只不过是在等io完成而已。如果只是想看CPU到底有多闲应该把io_wait和idle加起来才对。 mpstat命令 mpstat 是一个在 Linux 系统中用于监控多处理器系统性能的工具全称为 Multiprocessor Statistics。它提供了实时查询每个 CPU 的性能指标以及所有 CPU 的平均指标的功能。mpstat 是 sysstat 工具集中的一部分而 sysstat 是 Linux 系统性能分析的重要工具集。 mpstat 的基本语法为 mpstat [options] [interval [count]]其中 options 是命令的参数包括 -P { cpu [,...] | ON | ALL }指定要报告其统计信息的 CPU。使用 ALL 表示报告所有 CPU 的统计信息。interval相邻两次采样的间隔时间。count采样的次数。如果没有指定 count则采样次数为无限次并在结束后打印平均值。 mpstat 的输出包含了多个列每列代表不同的 CPU 使用率指标包括 %usr用户态使用的 CPU 百分比。%nice使用 nice 命令对进程进行降级时 CPU 的百分比。%sys内核进程使用的 CPU 百分比。%iowait等待进行 I/O 所使用的 CPU 时间百分比。%irq用于处理系统中断的 CPU 百分比。%soft用于软件中断的 CPU 百分比。%steal虚拟机强制 CPU 等待的时间百分比。%guest虚拟机占用 CPU 时间的百分比。%idleCPU 的空闲时间的百分比。 安装 mpstat 通常需要安装 sysstat 工具集安装方法可能因不同的 Linux 发行版而异。例如在 CentOS 上可以使用 yum install sysstat 命令进行安装而在 Ubuntu 上可以使用 apt install sysstat。 RK3568多核CPU的利用率 如果表示我们系统负载高那么通过top命令查看到的CPU利用率是四个核的平均值吗之前我们看到单个应用进程占用的CPU利用率超过了100%。 ---top 命令看版本。 你截图中的版本应该是以单核统计的。 单核统计的时候如果出现多核运行就会出现COMMAND运行CPU超过100%。 你的截图中就是系统CPU总占用只有28左右其中25%都是74中断代码占用的。 如果说系统总占用28%的话理论上即便一个核被沾满系统也不应该会挂死吧还有其他3个核是可以正常运行的那是不是就可以说明死机并不是由于单个CPU被中断占满导致的 ------top 这个100%只能是参考。他和死机没有必然联系。只是说这个方向有可能。 如果是CPU0被中断“完全”挂死响应不了其他中断也是有可能引起死机的。 有什么办法判断是哪个CPU挂死了呢 CPU0在挂死之前会有异常日志打印到串口吗我们现在死机的时候串口上没有任何打印。 ----怀疑和cpu 100%占用相关可以写个脚本监控top看是哪个程序跑满了cpu top命令实现 我们使用的top命令一般都是busybox中的 rootjenet:/usr/bin# busybox BusyBox v1.32.0 (2022-11-23 22:18:06 CST) multi-call binary. BusyBox is copyrighted by many authors between 1998-2015. Licensed under GPLv2. See source distribution for detailed copyright notices.Usage: busybox [function [arguments]...]or: busybox --list[-full]or: busybox --show SCRIPTor: busybox --install [-s] [DIR]or: function [arguments]...BusyBox is a multi-call binary that combines many common Unixutilities into a single executable. Most people will create alink to busybox for each function they wish to use and BusyBoxwill act like whatever it was invoked as.但是rk3568自己提供了一个top程序
http://www.lakalapos1.cn/news/40885/

相关文章:

  • 南充网站建设有哪些怎么开通自己的微信公众号
  • 网站备案收费标准门户网站建设的好处
  • 如何将自己做的网站发布到网上佛山建站公司模板
  • linux建设一个网站东莞企创做网站怎么样
  • phpstudy怎么做网站wordpress 热门文章调用
  • 哈尔滨网站网站建设泸州市网站建设
  • 网站定制解决方案北京网站关键词优化公
  • 个人网站在那建设做网站话术
  • 佛山网站搭建公司哪家好长沙网红打卡地方有哪些
  • 杭州燎远精品课程网站建设东莞市建设中心
  • 做高铁在哪个网站买自助建站免费平台
  • 做苗木生意上什么网站开网站做代发
  • 可信网站身份认证关于建设网站的请示报告
  • 深圳网站设计服务公网站建设人员分工
  • 网络下载的网站模板能直接上传到虚拟主机搜狗推广开户费多少钱
  • 单产品网站建设公司网站功能性建设有哪些
  • 深圳建网站的专业公司wordpress儿童主题
  • 求网站建设详细过程二手备案域名购买
  • 网页设计网站建设的书籍seo推广有效果吗
  • 有哪些网站可以做ps挣钱高端大气的科技网站模板
  • 共青城网站建设做一个赚钱的网站
  • 美食网站页面设计辽宁市营商环境建设局网站
  • 网站开发线上销售技巧施工企业发展的建议
  • 建立网站不公开制作网站公司服务器租赁一年的费用
  • 网站设计中遇到的问题免费浏览网站推广
  • 湘潭做网站品牌磐石网络前端开发语言
  • 免费人体做爰网站网站系统问题解决措施
  • 长春网站排名优化公司网统管公司的网站托管服务怎么样
  • 做百度移动端网站优做网站图片像素
  • 模板网站建设哪家好wordpress插件残留