dockerstats$(dockerps--format'{{.Names}}')dockerstats--format"table{{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"dockerstats$(dockerps|awk'{if(NR>1)print$NF}')dockerstats--format"table{{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"2、找出当前系统CPU使用量较高的进程
ps-aux|sort-rnk3|head-20(3换4,为内存)3、查看进程按内存从大到小排列
ps-eo"%C:%p:%z:%a"|sort-k5-nr4、按CPU利用率从大到小排列
ps-eo"%C:%p:%z:%a"|sort-nr5、查看占用内存最高的进程
psaux|head-1;psaux|grep-vPID|sort-rn-k+4|head6、pidstat-r查看每个进程的内存占用pidstat-r|sort-k9-nrLinux3.10.0-1160.15.2.el7.centos.plus.x86_64(storage044)12/11/2021_x86_64_(32CPU)10:19:20AMUIDPIDminflt/smajflt/sVSZRSS%MEMCommand10:14:31AM10003144666.970.00346366921823182413.84java10:14:31AM999162340.170.00510226446789603.55redis-server10:14:31AM0193570.330.007762004299880.33weed10:14:31AM0191740.250.006410123567640.27weed10:14:31AM10000198551.310.0010026122805320.21registry_DO_NOT7、top方式查看shift+Mpsaux--sort-%mem|lesse二、内存测试工具MemtesterMemtester主要是捕获内存错误和一直处于很高或者很低的坏位,其测试的主要项目有随机值,异或比较,减法,乘法,除法,与或运算等等.通过给定测试内存的大小和次数,可以对系统现有的内存进行上面项目的测试。
tarzxvfmemtester-4.2.2.tar.gzcdmemtester-4.2.2make&&makeinstall执行
sudomemtester70G5(内存大小+次数)三、名词概念1、什么是进程(whatisprocess)
进程是操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。
操作系统对进程的控制和管理通过PCB(ProcessingControlBlock),PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息(进程标识号,进程状态,进程优先级,文件系统指针以及各个寄存器的内容等),进程的PCB是系统感知进程的唯一实体。
一个进程至少具有5种基本状态:初始态、执行状态、等待(阻塞)状态、就绪状态、终止状态
2、什么是进程的生命周期(processlifecycle)
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。PID和父进程PPID是子进程环境的元素,任何进程都可以创建子进程。子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
3、进程状态(processstates)
1.运行(正在运行或在运行队列中等待)2.中断(休眠中,受阻,在等待某个条件的形成或接受到信号)3.不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生)4.僵死(进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放)5.停止(进程收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行运行)4、僵尸进程Zombie(有害)
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,那么此时子进程的进程控制块(PCB)仍驻留在内存中不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.此即为僵尸进程的危害,应当避免。
5、孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会出面处理它的一切善后工作,因此孤儿进程并不会有什么危害。
6、线程
线程也是操作系统提供的抽象概念,是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈和线程本地存储
系统利用PCB来完成对进程的控制和管理。同样,系统为线程分配一个线程控制块TCB(ThreadControlBlock),将所有用于控制和管理线程的信息记录在线程的控制块中,TCB中通常包括:线程标志符一组寄存器线程运行状态优先级线程专有存储区信号屏蔽
和进程一样,线程同样有五种状态:初始态、执行状态、等待(阻塞)状态、就绪状态和终止状态,线程之间的切换和进程一样也需要上下文切换,这里不再赘述。
7、进程VS线程
协程(Coroutine,又称微线程)是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制。协程与线程以及进程的关系见下图所示。
协程适用于IO阻塞且需要大量并发的场景,当发生IO阻塞,由协程的调度器进行调度,通过将数据流yield掉,并且记录当前栈上的数据,阻塞完后立刻再通过线程恢复栈,并把阻塞的结果放到这个线程上去运行。
1.1静态查看进程ps
-a显示终端上的所有进程-u以用户为主的格式来显示程序状态-x显示没有控制终端的进程,(显示所有程序,不以终端机来区分)-e显示所有进程。-f全格式。-h不显示标题。-l长格式。-w宽输出。,包括其他用户的进程。-r只显示正在运行的进程。1.3按占比升降序排列
#psaux--sort%cpu|less//--sort排序,升序(小到大)#psaux--sort-%cpu|less//-%CPU降序(-表示降序)#psaux--sortrss|less//以驻留内存升序排序#psaux--sort-rss|less1.4自定义显示字段
$cat/run/sshd.pid830第二种ps
#psaux|grepsshdroot101800.00.072241024Ss16:000:00/usr/sbin/sshd第三种pgrep
#pgrep-lsshd10180sshd#pgrepsshd10180第四种pidof
#pidofsshd10180top-d1-p10180(动态查看sshd的进程信息)1.6查看进程树pstree-p
查看进程之间的关系,且包含应用名
4-21:45:32的意思是进程运行了4天21个小时,45分钟,32秒
32-23:25:22的意思是进程运行了32天23小时,24分钟,22秒
ps-eolstart,pid,cmd|grepnginx|grep-vgrepFriJun1218:25:09202017485nginx:workerprocessFriJun1218:25:09202017486nginx:cachemanagerprocessWedMay2700:14:49202027921nginx:masterprocess/usr/local/openresty/nginx/sbin/nginx#cat/var/run/nginx.pid27921#date-d"`ps-eolstart,pid,cmd|grep27921|grep-vgrep|awk'{print$1,$2,$3,$4,$5}'`""+%Y-%m-%d"2020-05-27#date-d"`ps-eolstart,pid,cmd|grep27921|grep-vgrep|awk'{print$1,$2,$3,$4,$5}'`""+%Y-%m-%d:%H:%M:%S"2020-05-27:00:14:49#date-d"`ps-eolstart,pid,cmd|grep27921|grep-vgrep|awk'{print$1,$2,$3,$4,$5}'`""+%s"15905096892、top动态查看进程Usage:top-hv|-bcHiOSs-dsecs-nmax-u|Uuser-ppid(s)-ofield-w[cols]
运行中:
在top命令执行过程中可以使用的一些交互命令,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。Shift+n按PID排序Shift+p按CPU排序Shift+m按内存使用排序Shift+t按CPU用时排序Shift+按左边下一列排序/按右边下一列排序
运行前:
只查看有效用户名为mysql的进程
top-uMySQL只查看进程200和2000
top-p200,2000以非交互和非全屏模式运行
top-b运行top并记录命令输出,时长10小时,保存到plog文件
top-b-n12000>plogtop-bi-n120top-19:29:48up65days,4:22,1user,loadaverage:3.23,3.25,3.26Tasks:619total,2running,617sleeping,0stopped,0zombie%Cpu(s):2.9us,7.0sy,0.0ni,87.4id,0.3wa,0.0hi,2.4si,0.0stKiBMem:13173580+total,585648free,44998056used,86152104buff/cacheKiBSwap:4194300total,3417084free,777216used.85298192availMemPIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND4828root20013513686136936R200.00.0116461:32docker-proxy20274root20043.8g11.1g7408S125.08.973945:03java5157polkitd200846520836561168S87.50.058938:57redis-server12021op_admin20017273626961576R18.80.00:00.03top9root200000S6.20.0162:22.28rcu_sched5503root20061329272003104S6.20.0761:41.14envoy使top不显示任何闲置或者僵死进程,实用
top-id12.1上半部分:
I/O等待和CPU负载的关系
总结来说:磁盘读写高是导致wa升高的直接原因,而不是CPU负载高导致wa升高。当然,两者可能同时存在于高负载系统中,但原因和现象有所不同
2.2下半部分:
字段介绍虚拟内存(VIRT):virtualmemoryusage:(1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量需要这些内存,但并没有占满。)常驻内存(RES):residentmemoryusage:(1、进程当前使用的内存大小2、包含其他进程的共享3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反用了多少内存)。共享内存(SHR):sharedmemory:(1、除了自身进程的共享内存,也包括其他进程的共享内存2、计算某个进程所占的物理内存大小公式:RES–SHR)2.3进程信息
h|帮助M按内存的使用排序P按CPU使用排序N以PID的大小排序R对排序进行反转f自定义显示字段1显示所有CPU的负载<向前>向后z彩色,Z设置彩色,使用数字调整W保存top环境设置2.4信号种类
kill-9pid强制杀死kill-1pid重新加载配置,进程不会死等效于kill-HUPkill-15pid正常结束kill-18pid继续kill-19pid停止五、nice优先级设置(人为可设置nice范围-20到19)法一:nice-n-5sleep6000&发二:top-d1-ppid按r键//调整进程的优先级(NiceLevel)(-20高)---0---(19低)(直接回车)回车//确认该程序。-20回车//确认修改nice值。如果直接使用top,使用R调整nice值,先输入PID,再输入nice值即可。法三:renice-20pid六、杀死僵尸进程僵尸进程产生的原因
1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它2、父进程没有调用wait()或waitpid()函数来等待子进程的结束3、网络原因有时会引起僵尸进程;如何杀死僵尸进程?僵尸进程用kill命令是无法杀掉的,但是可以杀掉僵尸进程的父进程ppid,僵尸ppid挂了之后,僵尸进程就成了孤儿进程,孤儿进程不会占用系统资源,会被init程序收养,然后init程序将其回收。
查看具体僵尸进程:
杀僵尸进程的流程
2.查看僵尸进程的父进程
3.杀死僵尸进程对应的父进程
4.僵尸进程被回收(top查看僵尸进程总数为0)
top查看僵尸进程的总数,另外按1可显示所有的cpu核数
一条简单的命令,直接查找僵死进程,然后将父进程杀死
ps-A-ostat,ppid,pid,cmd|grep-e'^[Zz]'|awk'{print$2}'|xargskill-9ps-eoppid,stat|grepZ|cut-d””-f2|xargskill-9kill-HUP$(ps-A-ostat,ppid|grep-e’^[Zz]‘|awk’{print$2}’)ps-eal|awk'{if($2=="Z"){print$4}}'|kill-9kill-HUP:
想要更改配置而不需停止并重新启动服务,则使用该命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。
如重启Nginx:#kill-HUP`cat/app/nginx/nginx.pid`七、进程通信方式1.管道管道分为有名管道和无名管道
无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.
semget函数
它的作用是创建一个新信号量或取得一个已有信号量
semop函数
它的作用是改变信号量的值
semctl函数
该函数用来直接控制信号量信息
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.
消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.
socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。
套接字的特性由3个属性确定,它们分别是:域、类型和协议。