使用top命令,我们可以查询到CPU的使用率,等待,平均负载的一些情况 注意:CPU负载和CPU使用率没有直接关系!!! CPU上下文切换 CPU寄存器是CPU内置的容量小,但速度极快的内存。 程序计数器用来存储CPU正在执行的指令位置,即将执行的下一条指令位置,这些都是CPU执行任务前,要依赖的环境,也叫做CPU上下文。 产生原因 等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低 常见场景 磁盘读写请求过多导致大量IO等待Mysql死锁、Mysql全表扫描 理解Swap 简单来讲,就是用硬盘的一块空间来当做内存使用。 内存不足时,会使用Swap,把进程暂时不用的数据存储到磁盘中 Swap会导致严重的性能问题 理解Cached过大是怎么回事?
为了完成内存映射,内核为每个进程都维护了一个页表,记录虚拟地址和物理地址的映射关系。页表实际存储在CPU的内存管理单元MMU中,处理器可以直接通过硬件找出要访问的内存。 但是由于内存没有归还系统,在内存工作繁忙时,频繁的内存分配/释放会造成内存碎片。 后者在释放时直接归还系统,所以每次mmap都会发生缺页异常。 Swap原理 Swap本质就是把一块磁盘空间或者一个本地文件当作内存来使用,包括换入和换出两个过程: 换出:将进程暂时不用的内存数据存储到磁盘中,并释放这些内存 换入:进程再次访问内存时,将它们从磁盘读到内存中 缓冲区:原始磁盘块的临时存储,缓存将要写入磁盘的数据 进程内存指标 虚拟内存:5大部分 常驻内存:进程实际使用的物理内存,不包括Swap和共享内存 共享内存:与其他进程共享的内存,以及动态链接库和程序的代码段 如用堆栈明确声明内存空间来存储需要缓存的数据,或者用 Redis 外部缓存组件来优化数据的访问 cgroups 等方式来限制进程的内存使用情况,确保系统内存不被异常进程耗尽 /proc/pid/oom_adj
腾讯云图是一站式数据可视化展示平台,旨在帮助用户快速通过可视化图表展示大量数据,低门槛快速打造出专业大屏数据展示。新用户0.99元起,轻松搞定数据可视化
为了完成内存映射,内核为每个进程都维护了一个页表,记录虚拟地址和物理地址的映射关系。页表实际存储在 CPU 的内存管理单元 MMU 中,处理器可以直接通过硬件找出要访问的内存。 但是由于内存没有归还系统,在内存工作繁忙时,频繁的内存分配 / 释放会造成内存碎片。 后者在释放时直接归还系统,所以每次 mmap 都会发生缺页异常。 Swap 本质就是把一块磁盘空间或者一个本地文件当作内存来使用,包括换入和换出两个过程: 换出:将进程暂时不用的内存数据存储到磁盘中,并释放这些内存 换入:进程再次访问内存时,将它们从磁盘读到内存中 Linux 系统内存指标 已用内存 / 剩余内存 共享内存 (tmpfs 实现) 可用内存:包括剩余内存和可回收内存 缓存:磁盘读取文件的页缓存,slab 分配器中的可回收部分 缓冲区:原始磁盘块的临时存储,缓存将要写入磁盘的数据 如用堆栈明确声明内存空间来存储需要缓存的数据,或者用 Redis 外部缓存组件来优化数据的访问 cgroups 等方式来限制进程的内存使用情况,确保系统内存不被异常进程耗尽 /proc/pid/oom_adj
这个命令是查看Linux/Unix最好的命令,一个是Linux/Unix都支持,二是相比top,可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样 工作原理: 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。 当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。 ,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。
,磁盘类报警则相对来说属于性价比较高的,对于运维侧的需求则需要更进一步,那就是在重复度,复杂度的平衡中找到一种普适的处理办法,能够将这部分工作逐步的通过自动化方式处理,也就是从处理故障变为故障自愈模式。 ,我们会汇总为一个指标巡检大盘: 1)磁盘空间使用率,拆分为根目录使用率和数据目录使用率 2)内存使用率 3)CPU使用率 4)inode使用率 5)系统负载情况 6)数据库延迟 这份指标能够发现绝大多数明显的问题 二.系统层处理 系统层处理的硬伤问题相对比较少,主要碰到几类: 1)查看系统层的空间使用异常,但是进程没有释放相关的句柄,导致空间没有彻底释放。 比如一个nohup任务生成的日志比较大,我们手工删除了生成的日志文件,但是空间却没有释放,一般来说,可以使用lsof来得到相关的句柄的明细,也可以看到磁盘空间占用较高的文件对应的进程,顺着这条线分析, 三.数据库层处理 数据库层的清理可做的空间相对比较大,前提是你给自己预留的空间要足够大,否则坑足够大处理起来会比较纠结。
,同步到硬件中 13.3 CPU性能分析 13.3.1 CPU使用率分析 一台计算机中,最重要的硬件当属cpu了,我们虽然可以查看得到cpu的型号、参数,但在系统运行中,cpu的具体使用率,也是我们重点关注的数据 但当网速较慢时,播放器会显示正在缓冲。可以想象到,正在缓冲的播放器,并未被关闭,但由于电影数据未能下载完毕,还不能播放,则该播放器即处于等待读写状态。 buffer是指有数据写入磁盘时的缓冲区,cache表示从磁盘读取出文件时在内存中使用的缓存。 但是有些软件的特点是会占据所有剩余内存或部分内存(虽然实际不会真正全部使用到),所以有些服务器上查看内存使用率较高,甚至达到90%+,不过这对系统速度和正常使用的影响不大。 我们以QQ程序为例,没有起来时,QQ程序存放于磁盘分区中,但被运行起来后,在windows任务管理器的进程页中,会显示为QQ.exe进程。QQ程序整个的执行过程又可分为以下多个步骤,如图: ?
这些场景对磁盘、内存有比较高的要求,因此,京东也做了相应优化,用于减少内存消耗,提升磁盘整体使用率,使用更廉价的磁盘来降低成本等等。 ChubaoFS 设计的每个 pod 可以共享一个存储卷,或者每个 pod 一个存储卷,当容器所在的物理机宕机后,容器的数据可以随着容器被同时调度到其他宿主机上, 保障数据可靠存储。 ? 初始阶段 最初,京东 Elasticsearch 集群部署是完全没有架构可言的,集群配置也都采用默认配置,一台物理机启动多个 Elasticsearch 进程,进程间完全共享服务器资源,不同业务之间使用集群进行隔离 物理机内存被 cache 占用,新创建实例启动时耗时特别长。 实例存储受单机磁盘容量限制,数据迁移时有发生。 启动对资源的消耗要低很多,可以做到快速的启停。另外由于是资源限制类,只限制最大使用量而不隔离最小,这样又可以做到虚拟化进行资源超买,提升资源使用率。
这个命令是我查看 Linux/Unix 最喜爱的命令,一个是 Linux/Unix 都支持,二是相比 top,我可以看到整个机器的 CPU,内存,IO 的使用情况,而不是单单看到各个进程的 CPU 使用率和内存使用率 si 每秒从磁盘读入虚拟内存的大小,如果这个值大于 0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。 bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是 1024byte,我本机上没什么 IO 操作,所以一直是 0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到 in 每秒 CPU 的中断次数,包括时间中断 cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目, 例如在 apache 和 nginx 这种 web 服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择 web 服务器的进程可以由进程或者线程的峰值一直下调,压测,直到 cs 到一个比较小的值
基本概念解释 cpu平均负载 定义:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,和 CPU 使用率并没有直接关系。 0.50:没有任何作业在等待,但 CPU 正在处理以前的作业,并且它正在以 50% 的容量进行处理。在这种情况下,操作系统还可以立即将 CPU 时间分配给其他进程,而无需将其置于保持状态。 1.00:队列中没有作业,但 CPU 正在以 100% 的容量处理先前的作业,因此如果新进程请求 CPU 时间,则必须将其保留到另一个作业完成或当前 CPU 插槽时间(例如,CPU tick)到期,操作系统决定哪一个是下一个给定的进程优先级 CPU 密集型进程,使用大量 CPU 会导致平均负载升高;大量等待 CPU 的进程调度也会导致平均负载很高,此时 CPU 使用率也会比较高。 Shared:多个进程共享的内存总额 Buffers/cached:磁盘缓存的大小,Buffers是系统存放需要写入磁盘数据的临时区域,cached是操作系统从磁盘中读取进来的缓存数据 第一行 Mem
另一方面,对于内核计数器不能涵盖的细颗粒度内核数据,还必须要依赖内核跟踪采样工具获取。比如当IOPS较高时,我们想了解具体的每一个IO读写的具体文件信息,内核计数器中完全没有相关信息。 但同时对于一些高频使用的常规指标,如CPU、内存和网络使用率情况,使用白屏化监控平台展示,确实可以大大提升可观测性。 为了追求更加完美的磁盘空间稳定性,ssar仍然设计了更加积极的磁盘存储空间策略。还设置了专门的参数,当磁盘空间使用率达到阈值(默认90%)后,会停止数据采集。 不但如此,当由于其他进程原因使磁盘空间数据继续增长并超过90%时,ssar会启动对7天内较早历史数据的删除工作,直到磁盘空间使用率小于90%或将ssar历史数据基本删除。 唯一的缺点就是磁盘打满同时又需要消费ssar数据的场景,但这个场景概率极低。
另一方面,对于内核计数器不能涵盖的细颗粒度内核数据,还必须要依赖内核跟踪采样工具获取。比如当IOPS较高时,我们想了解具体的每一个IO读写的具体文件信息,内核计数器中完全没有相关信息。 但同时对于一些高频使用的常规指标,如CPU、内存和网络使用率情况,使用白屏化监控平台展示,确实可以大大提升可观测性。 为了追求更加完美的磁盘空间稳定性,ssar仍然设计了更加积极的磁盘存储空间策略。还设置了专门的参数,当磁盘空间使用率达到阈值(默认90%)后,会停止数据采集。 不但如此,当由于其他进程原因使磁盘空间数据继续增长并超过90%时,ssar会启动对7天内较早历史数据的删除工作,直到磁盘空间使用率小于90%或将ssar历史数据基本删除。 后续当整机free内存逐步恢复到绿线high阈值以上后,kswapd线程停止内存回收工作。
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。 so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。 bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到 in 每秒CPU的中断次数,包括时间中断 cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在 apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了
在内存触顶的时候,组件会定时Dump这些堆栈信息到本地磁盘,这样如果程序爆内存了,就可以将爆内存前Dump的堆栈数据上报到后台服务器进行分析。 ? 通过这种方式可以把耗时较高的符号还原工作放到服务器端,客户端只需要执行耗时较少的堆栈函数地址回溯操作,优化后的堆栈回溯方法耗时低于1us。 ? 假设App的内存块个数为25W,堆栈平均深度20行,每个堆栈地址采用8字节的整型数据存储,那么25W个堆栈数据将占用40M的内存空间。 所以我们的优化思路也很明确:只保留内存占用较大的堆栈。要完成这个工作就必须对内存中所有堆栈先进行聚类合并,统计出每个堆栈累计的内存值。 数据Dump方案 前面提到,在内存触顶后要将内存中的堆栈数据定时Dump到磁盘中,常规的方案是IO接口直接把数据写入到磁盘。因为数据Dump的频率较高,频繁的IO操作会导致程序卡顿。
结果调整参数后发现php-fpm reload之后,问题也没有解决,但同样发现了reload之后cpu的使用率恢复到了30%左右,此时更加坚信了CPU的使用率高和某些进程有关系。 就我个人而言,Z进程一般不会导致CPU飙这么高。Z进程一般会占用内存空间,虽然也会占用CPU资源,但那都可以忽略不计的。所以,此刻忽略了Z进程,没有对其进行干预操作(疏忽)。 翻查资料得到以下解释: kswapd0 进程占用 CPU 较高的处理,kswapd0 是 Linux 系统虚拟内存管理中负责换页的进程。 Linux 系统通过分页机制管理内存的同时,将磁盘的一部分划出来作为虚拟内存。当系统内存不足时,kswapd0 会频繁的进行换页操作。 当时查看内存使用和top的时候,没有发现内存使用过大(free、cache、buffer),所以才没有说Z进程影响使用率。
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0, 表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。 我的机器内存充裕,一切正常。 in 每秒CPU的中断次数,包括时间中断 cs 每秒上下文切换次数, 例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换, 这个值要越小越好,太大了,要考虑调低线程或者进程的 Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。 =(Used列数据之和)/(1k-blocks列数据之和) 磁盘和内存的区别与联系: (磁盘–也叫硬盘–或是U盘–或是移动硬盘) 1、硬盘与内存都是存储器,一个是内部,一个是外部。 3、内存与硬盘的联系也非常密切: 硬盘上的信息永远是暂时不用的,要用请装入内存! CPU与硬盘不发生直接的数据交换,CPU只是通过控制信号指挥硬盘工作,硬盘上的信息只有在装入内存后才能被处理。
二.压力测试要测些什么数据呢? 明确了压力测试的重要性,可如果让我来做压测,我该测试哪些要点呢? 服务器压测主要关注以下几点: 1.单个服务器进程的CPU使用率 在压测过程中统计该进程在运行过程中CPU使用率的变化情况,可以根据时间点来判断进程在运行过程中CPU占用是否合理,太高可能存在资源风险,太低的话资源利用率不足 2.单个服务器进程的内存使用率 观察进程运行过程中的内存利用率可以初步判断进程是否存在内存泄漏的风险。 Game Cache数据节点的磁盘IO瓶颈 5.事务的处理能力 观察事务成功率、TPS以及响应时间可以估算该服务器的合理上线用户数,以保障用户的游戏体验。 三.怎么去做压力测试呢? 目前腾讯WeTest压测除了能够在性能测试的过程中收集各项数据,包括CPU、内存、磁盘、网络、TPS、成功率以及延时等,同时还可以测试系统在极端情况下的运行状态。
O 也会导致平均负载升高,但 CPU 使用率不一定很高 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高 CPU 上下文切换 进程上下文切换: 进程的运行空间可以分为内核空间和用户空间 swap 换出,把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。 所以,文件系统确实还是要通过磁盘,来保证数据的持久化存储 系统在读写普通文件时,I/O 请求会首先经过文件系统,然后由文件系统负责,来与磁盘进行交互。 而在读写块设备文件时,会跳过文件系统,直接与磁盘交互 linux 内存里的 Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。 下次访问这些文件数据时,则直接从内存中快速获取,而不再次访问磁盘 磁盘性能指标 使用率,是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。
可以将虚拟内存看成是磁盘数据的一种缓存机制。另外,应用程序不需要关心虚拟内存的底层工作原理,虚拟内存有一套自己的逻辑来管理整个内存,应用程序的感知就像物理内存变大了一样。 当程序在进行一些计算时,CPU会请求内存中存储的数据,若数据不存在内存中,就会报告一个缺页错误(Page Fault),用户进程就中断了,进程会从用户态切换到系统态,交由操作系统内核处理缺页错误,处理完缺页错误之后 这时,让MMU把这个页帧分配给当前进程使用;而如果,此时内存中没有对应的页帧,则产生一个主缺页中断,这就需要CPU从已经打开的磁盘文件中读取相应的内容到物理内存,而后交由 MMU 建立这份页帧到页的映射关系 内存映射是指将硬盘上文件的位置与进程逻辑地址空间中一块大小相同的区域一一对应,当要访问内存中一段数据时,转换为访问文件的某一段数据。这种方式的目的同样是减少数据在用户空间和内核空间之间的拷贝操作。 /O操作,每秒也没有读写数据操作,cpu为空闲状态,空闲率98.99%,设备使用率为0。
,在分配的时间片段中完成,自动中断 如果某个计算,在分配的时间片段中没有完成,强制中断 如果某个任务需要的计算时间比较长,那么cpu的分片就会出现不连续的时间分片 内存 与CPU沟通的桥梁 存cpu的运算数据 数据 有内存数据 内存中的数据 外设数据 磁盘数据 执行顺序 CPU中的控制单元,控制指令执行的顺序,并不是按照先后顺序执行,而是按照优先级顺序 运算单元,进行计算时: 如果源数据充足 如果源数据不够, :CPU寄存器和程序计数器 程序计数器:存储CPU正在执行的指令位置和下一条指令的位置 上下文切换:先把当前的任务CPU上下文(CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文到CPU的寄存器和程序计数器中 同进程上下文切换:进程用户态-系统调用-进程内核-系统调用-进程用户态 不同进程上下文切换:进程切换时要保存进程用户态资源(虚拟内存,栈等) 线程上下文切换 线程,共享进程的资源,但是线程也有自己所有的数据 :buffer数磁盘虚拟出来的,用于内存从磁盘读取数据时使用 cache:cache是内存虚拟出来,用于cpu与内存速度匹配 pidstat:cswch/s 自愿上下文切换升高 当一个程序开启了大量的线程
在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。 索引节点缓存,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。 实现零复制的软件通常依靠基于直接存储器访问(DMA)的复制,以及通过内存管理单元(MMU)的内存映射。这些功能需要特定硬件的支持,并通常涉及到特定存储器的对齐。 使用率 是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。 饱和度 饱和度是指磁盘处理 I/O 的繁忙程度。 磁盘优化 数据的持久化存储,最终还是要落到具体的物理磁盘中,同时,磁盘也是整个 I/O 栈的最底层。从磁盘角度出发,自然也有很多有效的性能优化方法。
腾讯云数据库 MariaDB让您轻松在云端部署、使用 MariaDB 数据库。 云数据库MariaDB提供备份回档、监控、快速扩容、数据传输等MySQL数据库运维全套解决方案,为您简化 IT 运维工作,让您能更加专注于业务发展。
扫码关注云+社区
领取腾讯云代金券