| 
                         
	  高并发和响应快对应着性能优化的两个核心指标:吞吐和延时。 
	  
	  应用负载角度:直接影响了产品终端的用户体验 
	  
	  系统资源角度:资源使用率、饱和度等 
	  
	  性能问题的本质就是系统资源已经到达瓶颈,但请求的处理还不够快,无法支撑更多的请求。性能分析实际上就是找出应用或系统的瓶颈,设法去避免或缓解它们。 
	  
	  选择指标评估应用程序和系统性能 
	  
	  为应用程序和系统设置性能目标 
	  
	  进行性能基准测试 
	  
	  性能分析定位瓶颈 
	  
	  性能监控和告警 
	  
	  对于不同的性能问题要选取不同的性能分析工具。下面是常用的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                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |