加入收藏 | 设为首页 | 会员中心 | 我要投稿 莱芜站长网 (https://www.0634zz.com/)- 云连接、建站、智能边缘云、设备管理、大数据!
当前位置: 首页 > 综合聚焦 > Linux > 正文

Linux性能优化

发布时间:2023-02-20 10:14:08 所属栏目:Linux 来源:互联网
导读:高并发和响应快对应着性能优化的两个核心指标:吞吐和延时。 应用负载角度:直接影响了产品终端的用户体验 系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资源已经到达瓶颈,但请求的处理还不够快,无法支撑更多的请求。性能分析实际上就是找出

  高并发和响应快对应着性能优化的两个核心指标:吞吐和延时。
 
  应用负载角度:直接影响了产品终端的用户体验
 
  系统资源角度:资源使用率、饱和度等
 
  性能问题的本质就是系统资源已经到达瓶颈,但请求的处理还不够快,无法支撑更多的请求。性能分析实际上就是找出应用或系统的瓶颈,设法去避免或缓解它们。
 
  选择指标评估应用程序和系统性能
 
  为应用程序和系统设置性能目标
 
  进行性能基准测试
 
  性能分析定位瓶颈
 
  性能监控和告警
 
  对于不同的性能问题要选取不同的性能分析工具。下面是常用的Linux Performance Tools以及对应分析的性能问题类型。
 
  到底应该怎么理解"平均负载"
  平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。它和我们传统意义上理解的cpu使用率并没有直接关系。
 
  其中不可中断进程是正处于内核态关键流程中的进程(如常见的等待设备的I/O响应)。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
 
  平均负载多少时合理
  实际生产环境中将系统的平均负载监控起来,根据历史数据判断负载的变化趋势。当负载存在明显升高趋势时,及时进行分析和调查。当然也可以当设置阈值(如当平均负载高于cpu数量的70%时)
 
  现实工作中我们会经常混淆平均负载和cpu使用率的概念,其实两者并不完全对等:
 
  cpu密集型进程,大量cpu使用会导致平均负载升高,此时两者一致
 
  I/O密集型进程,等待I/O也会导致平均负载升高,此时cpu使用率并不一定高
 
  大量等待cpu的进程调度会导致平均负载升高,此时cpu使用率也会比较高
 
  平均负载高时可能是cpu密集型进程导致,也可能是I/O繁忙导致。具体分析时可以结合mpstat/pidstat工具辅助分析负载来源。
 
  cpu上下文切换
  cpu上下文切换,就是把前一个任务的cpu上下文(cpu寄存器和PC)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的位置,运行新任务。其中,保存下来的上下文会存储在系统内核中,待任务重新调度执行时再加载,保证原来的任务状态不受影响。
 
  按照任务类型,cpu上下文切换分为:
 
  进程上下文切换
 
  线程上下文切换
 
  中断上下文切换
 
  进程上下文切换
  Linux进程按照等级权限将进程的运行空间分为内核空间和用户空间。从用户态向内核态转变时需要通过系统调用来完成。
 
  一次系统调用过程其实进行了两次cpu上下文切换:
 
  cpu寄存器中用户态的指令位置先保存起来,cpu寄存器更新为内核态指令的位置,跳转到内核态运行内核任务;
 
  系统调用结束后,cpu寄存器恢复原来保存的用户态数据,再切换到用户空间继续运行。
 
  系统调用过程中并不会涉及虚拟内存等进程用户态资源,也不会切换进程。和传统意义上的进程上下文切换不同。因此系统调用通常称为特权模式切换。
 
  进程是由内核管理和调度的,进程上下文切换只能发生在内核态。因此相比系统调用来说,在保存当前进程的内核状态和cpu寄存器之前,需要先把该进程的虚拟内存,栈保存下来。再加载新进程的内核态后,还要刷新进程的虚拟内存和用户栈。
 
  进程只有在调度到cpu上运行时才需要切换上下文,有以下几种场景:cpu时间片轮流分配,系统资源不足导致进程挂起,进程通过sleep函数主动挂起,高优先级进程抢占时间片,硬件中断时cpu上的进程被挂起转而执行内核中的中断服务。
 
  线程上下文切换
  线程上下文切换分为两种:
 
  前后线程同属于一个进程,切换时虚拟内存资源不变,只需要切换线程的私有数据,寄存器等;
 
  前后线程属于不同进程,与进程上下文切换相同。
 
  同进程的线程切换消耗资源较少,这也是多线程的优势。
 
  中断上下文切换
 
  中断上下文切换并不涉及到进程的用户态,因此中断上下文只包括内核态中断服务程序执行所必须的状态(cpu寄存器,内核堆栈,硬件中断参数等)。
 
  中断处理优先级比进程高,所以中断上下文切换和进程上下文切换不会同时发生。
 
  cpu上下文切换(下)
  通过vmstat可以查看系统总体的上下文切换情况:
 
  vmstat 5         #每隔5s输出一组数据
  procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
   1  0      0 103388 145412 511056    0    0    18    60    1    1  2  1 96  0  0
   0  0      0 103388 145412 511076    0    0     0     2  450 1176  1  1 99  0  0
   0  0      0 103388 145412 511076    0    0     0     8  429 1135  1  1 98  0  0
   0  0      0 103388 145412 511076    0    0     0     0  431 1132  1  1 98  0  0
   0  0      0 103388 145412 511076    0    0     0    10  467 1195  1  1 98  0  0
   1  0      0 103388 145412 511076    0    0     0     2  426 1139  1  0 99  0  0
   4  0      0  95184 145412 511108    0    0     0    74  500 1228  4  1 94  0  0
   0  0      0 103512 145416 511076    0    0     0   455  723 1573 12  3 83  2  0
  cs (context switch) 每秒上下文切换次数
 
  in (interrupt) 每秒中断次数
 
  r (runnning or runnable)就绪队列的长度,正在运行和等待cpu的进程数
 
  b (Blocked) 处于不可中断睡眠状态的进程数
 
  要查看每个进程的详细情况,需要使用pidstat来查看每个进程上下文切换情况:
 
  pidstat -w 5
  14时51分16秒   UID       PID   cswch/s nvcswch/s  Command
  14时51分21秒     0         1      0.80      0.00  systemd
  14时51分21秒     0         6      1.40      0.00  ksoftirqd/0
  14时51分21秒     0         9     32.67      0.00  rcu_sched
  14时51分21秒     0        11      0.40      0.00  watchdog/0
  14时51分21秒     0        32      0.20      0.00  khugepaged
  14时51分21秒     0       271      0.20      0.00  jbd2/vda1-8

(编辑:莱芜站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读