Linux
2021-02-04 14:20:00 1 举报
AI智能生成
登录查看完整内容
Linux性能优化相关命令
作者其他创作
大纲/内容
h1 class=\"Post-Title\" style=\
信号
kill信号大全
不可靠信号(非实时的) 编号1-31
可靠信号(实时信号)编号32-63
一般来说,在linux shell中ctrl-c 是发送 SIGINT 信号, ctrl-z 是发送 SIGSTOP信号 ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF
收到信号的进程对信号的处理方法?
第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
信号处理流程
信号诞生信号在进程中注册信号的执行和注销
抓包相关命令
tcpdump
参数选项
linux性能分析命令
背景
span style=\
perf
主要作用
Perf工具可用来对软件进行优化,包括算法优化(空间复杂度、时间复杂度)和代码优化(提高执行速度、减少内存占用)。还可以评估程序对硬件资源的使用情况,例如各级cache的访问次数,各级cache的丢失次数、流水线停顿周期、前端总线访问次数等。也可以评估程序对操作系统资源的使用情况,系统调用次数、上下文切换次数、任务迁移次数等
常用命令
p style=\
常用命令总结
Linux性能检测常用的10个基本命令
pstack
pstack用来跟踪进程栈,这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在
使用 pstack 进程ID
strace
跟踪程序执行过程中产生的系统调用及接收到的信号,帮助分析程序或命令执行中遇到的异常情况。
性能优化工具
区别
如:p style=\
如:span style=\
ulimit
sysctl
优化方法
strong style=\
参数说明
文件系统调整
修改I/O调度算法
网络性能调优
调优场景
项目上系统参数设置
div yne-bulb-block=\"paragraph\" style=\
Linux代码
内存管理
非连续分配管理方式
基本分页存储管理方式
思想
在分区存储管理中,要把作业放在一个连续的存储区中,因而会产生碎片问题(外部碎片)。尽管通过拼接方式可以解决碎片问题,但代价较高。如果允许将一个作业存放到许多不相邻接的分区中,那么就可以避免拼接,,从而有效解决外部碎片问题。基于这一思想引入了分页存储管理(或称页式存储管理)技术
类型
分页管理
在分页存储管理中,用户作业的地址空间被划分称若干个大小相等的区域,称为页或页面。相应地,将主存的存储空间也分成与页面大小相等的区域,称为块或物理块。在为作业分配存储空间时,总是以块为单位来分配,可以将作业中的任意一页放入主存的任意一块中。
页表
基本地址变换机构
具有快表的地址变换机构
内存抽象:地址空间
无内存抽象存在的问题
用户程序可以访问任意内存,容易破坏操作系统,造成崩溃同时运行多个程序特别困难
基址寄存器与界限寄存器可以简单的动态重定位,每个内存地址送到内存之前,都会自动加上基址寄存器的内容。交换技术把一个进程完全调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存在磁盘上,所以当他们不运行时就不会占用内存。
为什么要有地址空间?
首先直接把物理地址暴露给进程会带来严重问题如果用户程序可以寻址内存的每个字节,就有很大的可能破坏操作系统,造成系统崩溃同时运行多个程序十分困难 地址空间创造了一个新的内存抽象,地址空间是一个进程可用于寻址内存的一套地址的集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其它进程的地址空间。使用基址寄存器和界限器可以实现。
虚拟内存
虚拟内存是现代操作系统普遍使用的一种技术。前面所讲的抽象满足了多进程的要求,但很多情况下,现有内存无法满足仅仅一个大进程的内存要求(比如很多游戏,都是10G+的级别
基本思想
虚拟地址和物理地址匹配规则
虚拟页号可用做页表的索引,以找到该虚拟页面对应页表项。由页表项可以找到页框号。然后把页框号拼接到偏移量的高位端,以替换虚拟页号,形成送往内存的物理地址。页表的目的是把虚拟页面映射为页框,从数学的角度来说,页表是一个函数,它的参数是,虚拟页号,结果是物理页框号。通过这个函数可以把虚拟地址中的虚拟页面域替换为页框域,从而形成物理地址。
页面置换算法
最优页面置换算法(Optimal Page Replacement Algorithm)
最近最少使用页面置换算法(Least Recently Used)
最近未使用页面置换算法(Not Recently Used Replacement Algorithm)
先进先出的页面置换算法(First-In First-Out Page Replacement Algorithm)
第二次机会页面置换算法(Second Chance Page Replacement Algorithm)
时钟替换算法(Clock Page Replacement Algorithm)
算法比较
子主题
分页系统中的设计问题
在任何分页式系统中,都需要考虑两个主要的问题:虚拟地址到到物理地址的映射必须非常快;如果虚拟地址空间很大,页表也会很大。
局部分分配策略与全局分配策略
负载控制 , 即使使用了最优的页面置换算法,最理想的全局分配。当进程组合的工作集超出内存容量时,就可能发生颠簸。这时只能根据进程的特性(IO 密集 or CPU 密集)将进程交换到磁盘上。
页面大小 的确定不存在全局最优的结果,小页面减少页面内内存浪费,但是小页面,意味着更大的页表,更多的计算转换时间。现在一般的页面大小是 4KB 或 8KB
内核空间
页(page)是内核的内存管理的基本单位
struct page { page_flags_t flags; 页标志符 atomic_t _count; 页引用计数 atomic_t _mapcount; 页映射计数 unsigned long private; 私有数据指针 struct address_space *mapping; 该页所在地址空间描述结构指针,用于内容为文件的页帧 pgoff_t index; 该页描述结构在地址空间radix树page_tree中的对象索引号即页号 struct list_head lru; 最近最久未使用struct slab结构指针链表头变量 void *virtual; 页虚拟地址};
flags:页标志包含是不是脏的,是否被锁定等等,每一位单独表示一种状态,可同时表示出32种不同状态,定义在<linux/page-flags.h>_count:计数值为-1表示未被使用。virtual:页在虚拟内存中的地址,对于不能永久映射到内核空间的内存(比如高端内存),该值为NULL;需要事必须动态映射这些内存。
用户空间
用户空间中进程的内存,往往称为进程地址空间。Linux采用虚拟内存技术。进程的内存空间只是虚拟内存(或者叫作逻辑内存),而程序的运行需要的是实实在在的内存,即物理内存(RAM)。在必要时,操作系统会将程序运行中申请的内存(虚拟内存)映射到RAM,让进程能够使用物理内存。
地址空间
每个进程都有一个32位或64位的地址空间,取决于体系结构。 一个进程的地址空间与另一个进程的地址空间即使有相同的内存地址,也彼此互不相干,对于这种共享地址空间的进程称之为线程。一个进程可寻址4GB的虚拟内存(32位地址空间中),但不是所有虚拟地址都有权访问。对于进程可访问的地址空间称为内存区域。每个内存区域都具有对相关进程的可读、可写、可执行属性等相关权限设置。内存区域可包含的对象:代码段(text section): 可执行文件代码数据段(data section): 可执行文件的已初始化全局变量(静态分配的变量和全局变量)。bss段:程序中未初始化的全局变量,零页映射(页面的信息全部为0值)。进程用户空间栈的零页映射(进程的内核栈独立存在并由内核维护)每一个诸如C库或动态连接程序等共享库的代码段、数据段和bss也会被载入进程的地址空间任何内存映射文件任何共享内存段任何匿名的内存映射(比如由malloc()分配的内存)这些内存区域不能相互覆盖,每一个进程都有不同的内存片段。
内存描述符
内存描述符由mm_struct结构体表示
struct mm_struct { struct vm_area_struct *mmap; rb_root_t mm_rb; ... atomic_t mm_users; atomic_t mm_count; struct list_head mmlist; ...};
mm_users:代表正在使用该地址的进程数目,当该值为0时mm_count也变为0;mm_count: 代表mm_struct的主引用计数,当该值为0说明没有任何指向该mm_struct结构体的引用,结构体会被撤销。mmap和mm_rb:描述的对象都是相同的mmap以链表形式存放, 利于高效地遍历所有元素mm_rb以红黑树形式存放,适合搜索指定元素mmlist:所有的mm_struct结构体都通过mmlist连接在一个双向链表中,该链表的首元素是init_mm内存描述符,它代表init进程的地址空间。在进程的进程描述符(<linux/sched.h>中定义的task_struct结构体)中,mm域记录该进程使用的内存描述符。故current->mm代表当前进程的内存描述符。fork()函数 利用copy_mm函数复制父进程的内存描述符,子进程中的mm_struct结构体通过allcote_mm()从高速缓存中分配得到。通常,每个进程都有唯一的mm_struct结构体,即唯一的进程地址空间。当子进程与父进程是共享地址空间,可调用clone(),那么不再调用allcote_mm(),而是仅仅是将mm域指向父进程的mm,即 tsk->mm = current->mm。相反地,撤销内存是exit_mm()函数,该函数会进行常规的撤销工作,更新一些统计量。内核线程没有进程地址空间,即内核线程对应的进程描述符中mm=NULL内核线程直接使用前一个进程的内存描述符,仅仅使用地址空间中和内核内存相关的信息
应用程序操作的对象时映射到物理内存之上的虚拟内存,而处理器直接操作的是物理内存。故应用程序访问一个虚拟地址时,需要将虚拟地址转换为物理地址,然后处理器才能解析地址访问请求,这个转换工作通过查询页表完成。
Linux使用三级页表完成地址转换。顶级页表:页全局目录(PGD),指向二级页目录;二级页表:中间页目录(PMD),指向PTE中的表项;最后一级:页表(PTE),指向物理页面。多数体系结构,搜索页表工作由硬件完成。每个进程都有自己的页表(线程会共享页表)。为了加快搜索,实现了翻译后缓冲器(TLB),作为将虚拟地址映射到物理地址的硬件缓存。还有写时拷贝方式共享页表,当fork()时,父子进程共享页表,只有当子进程或父进程试图修改特定页表项时,内核才创建该页表项的新拷贝,之后父子进程不再共享该页表项。可见,利用共享页表可以消除fork()操作中页表拷贝所带来的消耗。
进程与内存
所有进程都必须占用一定数量的内存,这些内存用来存放从磁盘载入的程序代码,或存放来自用户输入的数据等。内存可以提前静态分配和统一回收,也可以按需动态分配和回收。对于普通进程对应的内存空间包含5种不同的数据区:代码段数据段BSS段堆:动态分配的内存段,大小不固定,可动态扩张(malloc等函数分配内存),或动态缩减(free等函数释放);栈:存放临时创建的局部变量;
0 条评论
回复 删除
下一页