linux性能优化实战-内存性能指标

转自:https://blog.csdn.net/san_77227487/article/details/87938546

https://blog.csdn.net/zxcc1314/article/details/86751559

内存映射

Linux内核给每个进程提供了一个独立的连续虚拟地址空间(独立!可以将进程内存隔离)。

每个进程的虚拟地址分为内核空间和用户空间。但内核空间,其实关联的都是相同的物理内存。进程用户态只能访问用户空间内存;内核态可以访问内核空间内存。

内存映射就是将虚拟内存地址映射到物理内存地址,内核为每个进程都维护了一张页表,记录映射关系。
页表实际存储在CPU的内存管理单元MMU中,页表还有一个缓冲TLB(Translation Lookaside Buffer,转译后备缓冲器)。

页的大小为4KB,为了解决页过多,Linux提供了两种机制多级页表和大页(HugePage)。
多级页表就是把内存分成区块来管理,将原来的映射关系改成区块索引和区块内的偏移,这样可以大大减少页表的项数。(其实也可以直接映射正使用的页,但这会导致页不连续,不能使用偏移量查找)
Linux使用四级页表管理内存页。

大页就是比普通页更大的内存块。

当访问虚拟地址在页表中找不到时,会产生缺页异常,进入内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

虚拟内存空间分布

上图为32位系统虚拟内存空间分布。
除内核空间外,用户空间内存,从低到高分别是五种不同内存段。

只读段,包括代码和常量等。
数据段,包括全局变量等。
堆,包括动态分配的内存,从低地址开始向上增长。
文件映射段,包括动态库、共享内存等,从高地址开始向下增长。
栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。
比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。

内存分配
malloc()两种实现方式:

对小块内存(小于 128K),C 标准库使用 brk() 来分配,通过移动堆顶的位置来分配内存。这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用。
大块内存(大于 128K),使用内存映射 mmap()在文件映射段找一块空闲内存分配。释放时直接归还给系统。
在内核空间,Linux 则通过 slab 分配器来管理小内存。可以把 slab 看成构建在伙伴系统上的一个缓存,主要作用就是分配并释放内核中的小对象。

malloc() 申请内存后,内存并不会立即分配,而是在首次访问时,才通过缺页异常陷入内核中分配内存。

理解内存中的Buffer和Cache
man free ,可以看到buffer 和 cache 的说明:

Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached与 SReclaimable 之和。
man proc,关于meminfo 说明:

Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。
Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。
SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。

一、IO性能指标

二、IO性能工具

三、基本思路

1. 先用 iostat 发现磁盘 I/O 性能瓶颈;

2. 再借助 pidstat ,定位出导致瓶颈的进程;

3. 分析进程的 I/O 行为;

4. 结合应用程序的原理,分析这些 I/O 的来源。

原文地址:https://www.cnblogs.com/yanwei-wang/p/10739808.html

时间: 2024-11-05 06:54:10

linux性能优化实战-内存性能指标的相关文章

Linux性能优化实战

你是否也曾跟我一样,看了很多书.学了很多 Linux 性能工具,但在面对 Linux 性能问题时,还是束手无策?实际上,性能分析和优化始终是大多数软件工程师的一个痛点.但是,面对难题,我们真的就无解了吗? 固然,性能问题的复杂性增加了学习难度,但这并不能成为我们进阶路上的“拦路虎”.在我看来,大多数人对性能问题“投降”,原因可能只有两个. 一个是你没找到有效的方法学原理,一听到“系统”.“底层”这些词就发怵,觉得东西太难自己一定学不会,自然也就无法深入学下去,从而不能建立起性能的全局观. 再一个

Linux性能优化实战: Linux 性能优化答疑(四)(32)

一.上节总结 专栏更新至今,四大基础模块的第三个模块——文件系统和磁盘 I/O 篇,我们就已经学完了.很开心你还没有掉队,仍然在积极学习思考和实践操作,并且热情地留言与讨论. 今天是性能优化的第四期.照例,我从 I/O 模块的留言中摘出了一些典型问题,作为今天的答疑内容,集中回复.同样的,为了便于你学习理解,它们并不是严格按照文章顺序排列的. 每个问题,我都附上了留言区提问的截屏.如果你需要回顾内容原文,可以扫描每个问题右下方的二维码查看. 二.问题 1:阻塞.非阻塞 I/O 与同步.异步 I/

Linux性能优化实战:案例篇-DNS 解析时快时慢,我该怎么办?(37)

一.上节回顾 上一节,我带你一起学习了网络性能的评估方法.简单回顾一下,Linux 网络基于 TCP/IP协议栈构建,而在协议栈的不同层,我们所关注的网络性能也不尽相同. 在应用层,我们关注的是应用程序的并发连接数.每秒请求数.处理延迟.错误数等,可以使用 wrk.Jmeter 等工具,模拟用户的负载,得到想要的测试结果. 而在传输层,我们关注的是 TCP.UDP 等传输层协议的工作状况,比如 TCP 连接数.TCP 重传.TCP 错误数等.此时,你可以使用 iperf.netperf 等,来测

linux性能优化实战-磁盘子系统优化

转自:https://blog.csdn.net/twypx/article/details/80290764 磁盘子系统的调优 磁盘在LAMP架构中扮演着重要的角色,静态文件.模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘,对磁盘的许多调优(尤其是对数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高,因此,花一些时间对磁盘硬件进行优化是有意义的. 首先要做的是,确保在文件系统上禁用atime日志记录特性.atime是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳

Linux性能优化实战:如何利用系统缓存优化程序的运行效率?(17)

一.缓存命中率 1.引子 1.我们想利用缓存来提升程序的运行效率,应该怎么评估这个效果呢? 用衡量缓存好坏的指标 2.有没有哪个指标可以衡量缓存使用的好坏呢? 缓存命中率 3.什么是缓存命中率? 所谓缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比.命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好 2.查看系统命中情况的工具 1.缓存在高并发系统的应用 实际上.缓存是现在所有高并发系统必须的核心模块,主要作用就是把经常访问的数据(也就是热点数据),提取读入

linux性能优化实战-网络性能调优

转自:https://blog.csdn.net/twypx/article/details/80290759 大多数Linux发行版都定义了适当的缓冲区和其他TCP参数,可以通过修改这些参数来分配更多的内存,从而改进网络性能.设置内核参数的方法是通过proc接口,也就是通过读写/proc中的值.幸运的是,sysctl可以读取/etc/sysctl.conf中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数. 下面展示了在互联网服务器上应用于Internet服务器的一些比较激进的网络

Linux性能优化实战:负载均衡与CPU使用率(01)

一.CPU使用率并没有直接关系 1.平均负载 单位时间内,系统处于可运行状态和不可终端状态的平均进程数也就是平均活跃进程数,它和cpu使用率并没有直接关系, 可运行状态: 正在使用的cpu或者正在等待cpu的进程 不可中断状态 进程是正处于内核关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备I/O响应,也就是我们在ps命令中看到的D状态的状态 或者中断打断的 ,这个时候的 进程处于不可终端状态,如果此时的进程被打断了 ,就容易出现磁盘数据与进程不一致的 问题 所以,不可中断

Linux性能优化实战:系统的swap变高(08)

一.Swap 原理 前面提到,Swap 说白了就是把一块磁盘空间或者一个本地文件(以下讲解以磁盘为例),当成内存来使用.它包括换出和换入两个过程 1.所谓换出 就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存. 2.换入 则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来 所以你看,Swap 其实是把系统的可用内存变大了.这样,即使服务器的内存不足,也可以运行大内存的应用程序 3.应用场景 即是内存不足时,有些程序也并不像被OOM杀死,二十希望能缓一段时间,等待人工介入

Linux性能优化实战:系统的swap变高(09)

一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.1 LTS Release: 18.04 Codename: bionic 2.内存 root@openstack:~# free -h total used free shared buff/cache available Mem: 4.9G 1