4.Linux性能诊断 --- Linux工作流程&内存管理

Linux工作流程 : 
	1.POST加电自检
	2.加载BIOS, BIOS 加载 CMOS , 取得硬件信息和自我检测,取得第一个可启动设备
	3.读取第一个启动设备内 MBR(MasterBoot Record,主引导分区) 的 Boot Loader
	4.Boot Loader(主引导程序,识别操作系统的文件格式,决定装载哪个内核)
	5.加载内核,内核检测硬件和加载驱动程序
	6.内核驱动成功后,调取 init 进程,init 取得 run-level 信息
	7.init 执行 /etc/rc.d/rc.sysinit 准备软件执行的环境, /etc/inittab
	8.init 执行 run-level 的各个服务的启动
	9.init 执行 /etc/rc.d/rc.local 文件
	10.init 执行终端模拟程序mingetty启动login进程,等待用户登录

有2种方式查看内核引导和运行诊断信息:
	1.查看内核系统日志文件,/var/log/kern.log
	2.执行dmesg 命令

内核初始化的顺序如下:
	1.检查cpu
	2.检查内存
	3.发现设备总线
	4.发现设备
	5.辅助内核子系统启动
	6.挂载根目录
	7.用户空间启动

文件 /proc/cmdline 记录了内核启动参数

查看运行级别:
who -r  //run-level 3  2017-11-27 18:00

用户空间启动顺序:
	1.init
	2.必要的底层服务,如 :udevd 和 syslog
	3.网络配置
	4.中高层服务,如 cron, printing
	5.登录提示,图形界面以及其他高层次应用

天字第一号进程:
	init(initialization 的缩写)是Unix和类Unix系统中用来产生其他所有进程的程序。它也守护进程的方式存在,其进程号为1.Linux系统
  开机时加载Linux内核后,便由Linux内核加载init程序,由init程序完成剩余的开机过程,比如加载运行级别,加载服务,引导shell/图形化界面等等。

在Linux发行版中,init有3种主要的实现形式:
	1.System V init : 传统的
		System V init 存在一个启动序列,同一时间只能启动一个任务,在这种架构下,很容易解决依赖问题,但性能方面要受到一些影响。
	2.systemd : 所有主流Linux发行版中标准的init
		Systemd is goal oriented : 针对System V init 的不足,systemd 所有的服务都并发启动。systemd 基于目标的,需要定义要实现的目标,
      以及它的依赖项。systemd 将所有的过程都抽象为一个配置单元,即unit。可以认为一个服务是一个配置单元,一个挂载点是一个配置单元。
	3.Upstart : Ubuntu
		Upstart 是基于事件的,Upstart的事件驱动模型允许它以异步方式对生成的事件作出回应。
内存管理:
	内存是计算机中与cpu进行沟通的桥梁,用于暂时存放cpu中的运算数据。在早期的Unix系统中,fork启动新进程的时候,由于父进程
  往子进程复制内存信息需要消耗一定的时间,因此启动多个进程存在性能瓶颈。现在的Linux内核则通过'写时复制'等机制提高了创建进程
  的效率;也正是因为如此,关于Linux内存分配,计算,空闲判断有一些特别需要注意的地方。

内存异常:out of memory(OOM) killer
	最常见的内存管理异常就是 Out of memory 问题。通常是因为某个应用程序大量请求内存导致系统内存不足造成的,触发内核里的
  Out of memory killer, OOM killer 会杀掉某个进程以释放内存给系统内核用。它实际上是一种保护机制,不至于让系统立即崩溃。
    内核检测到内存利用不足,就会选择杀掉某个 'bad'进程。如何判断和选择一个'bad'进程呢?算法和思路非常简单:最bad的那个及承诺函就是
  占用内存最多的进程。

我的内存利用率为什么特别高?
	1.内存利用率(概括):free
	2.内核利用率(进程):top

	内存空闲率 = (total - used)/total 
	'真实的'内存空闲率 = (free + shared + buffers + cached)/total 

	按照用户,内存可以划分为 '内核内存'和'用户内存'(用户进程及磁盘高速缓存),包括内核本身在内,程序在访问物理内存时,并不直接指定物理地址,
  而是指定逻辑地址。cpu上搭载的硬件MMU(memory management unit)会参照物理--逻辑地址对应关系表实现对映射后物理地址上的数据访问。

Linux内存的分类:
	用户内存的分类有2组概念比较重要:匿名内存和file-backed 内存;active 和 inactive。它们的区别如下:
		1.匿名内存:用来存储用户进程计算过程中间的数据,与物理磁盘的文件没有关系
		2.file-backed内存:用作磁盘高速缓存,其物理内存与磁盘上的文件是对应的
		3.active:刚刚被使用过的数据的内存空间
		4.inactive:包含有长时间未被使用过的数据的内存空间

	shmem(shared memory) 指的就是 tmpfs 所使用的内存---一个机遇内存的文件系统,提供可以接近于零延迟的快速存储区域。Linux可以将空闲内存用于缓冲,
  并且在应用程序需要的时候回收。
    '/ + buffers/cache' : 提供了关于内存利用率更加准确的数值。
    buffers:buffer cache,用于块设备IO
    cached : page cache,用于文件系统

Linux内存的计算:
	各类内存的计算公式如下:
	shmem = 磁盘高速缓存(buffers/cached) - File-backed内存(file) = 匿名内存(anon) - AnonPages 用户内存 = Active(file) + inactive(file) + active(anon) +inactive(anon) + unevictable = buffers + cached + AnonPages

	内核内存 = Memtotal - (MemFree + Active + Inactive + unevictable)

Linux 进程的内存:
	执行 'ps aux' 后输出的各个进程的RSS(resident set size),表示进程占用内存的大小,单位是kb。需要注意的是,RSS值实际上是基于 pmap命令,表示'该进程正在使用
  的物理内存的总和'。pmap提供了进程的内存映射,也可以支持多个额进程的内存状态显示。与 ldd 命令类似,pmap 命令可以查看到程序调用的路径。如果查看一个已经运行,但是
  又不知道路径的程序,使用pmap更快捷。

    /proc/PID/status 支持的选项有:
    1.VmData:  data 段大小
    2.VmExe:   text 段大小
    3.VmLib : 共享库的使用量
    4.VmRSS : 物理内存的使用量
    5.VmSwap : 交换空间的使用量

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值