测试环境和生产环境不同,该如何做性能测试呢?
答:通过多次压测来计算性能损耗
进程与线程
1、进程
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。简单来说就是进程是可以独立运行的。
2、线程
线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能够独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源。一个线程可以创建和撤销另一个线程。
3、区别
1)一个线程只能属于一个进程,而一个进程可以有多个线程;
2)线程是进程工作的最小单位;
3)一个进程会分配一个地址空间,进程与进程之间不共享地址空间,即不共享内存;
4)同一个进程下的多个不同线程共享父进程的地址空间;
5)线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的方式实现同步;
6)线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
进程的优点
1)每个进程相互独立,不影响主程序的稳定,子进程崩溃不影响其他进程
2)通过增加CPU就可以扩充性能【但损耗也会递增】
3)可以尽量减少线程加锁与解锁的影响,极大的提高了性能
进程的缺点
1)逻辑控制复杂,需要和主程序交互
2)多进程调度开销大
线程的优点
1)程序逻辑和控制方式简单
2)所有线程可以直接共享内存和变量
3)线程方式消耗的总资源比进程方式少
线程的缺点
1)每个线程与主程序共用地址空间,最大内存地址受限
2)线程之间的同步和加锁不易控制
3)一个线程的崩溃可能影响到整个程序的稳定性
Linux监控命令
一、实时监控
top:能够实时监控系统的运行状态,并且可以按照CPU及内存等进行排序
语法
代码语言:javascript复制# 监控指定进程;当监控多个进程时,
# 进程ID以逗号分隔。这个命令只能在命令行下使用
top -p id1,id2
# 按CPU使用率排序
top -P
# 按内存使用率排序
top -M
top中load average:系统的运行队列的平均使用率,也可以认为是可运行进程的平均数。三个值分别表示在最后的1分钟、5分钟、15分钟的平均负载值。
说明
在单核CPU中load average的值为1时表示满负荷状态。
在多核CPU中满负载的load average的值为1*CPU核数
vmstat:可以监控操作系统的进程状态、内存、虚拟内存、磁盘IO、CPU的信息
代码语言:javascript复制-S:使用指定单位显示。参数有k、K、m、M,分别代表
1000、1024、1000000、1048576字节。默认单位为K(1024 bytes)
free:能够监控系统的内存使用状态。其中,total:总计物理内存的大小;Used:已使用;Free:可用;shared:多个进程共享的内存总额;buffers/cached:磁盘缓存的大小。
二、实时监控 - CPU
mpstat:可以查看多核心CPU中每个计算核心的统计数据(前面3个命令不可以)。
代码语言:javascript复制# 监控哪个CPU,CPU在0到CPU个数-1中取值【P是大写】
-P
# 相邻的两次采样的间隔时间
internal
# 采样的次数,count只能和delay一起使用
count
当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行信息为自系统启动以来的平均信息,从第二行开始,输出为前一个interval时间段的平均信息。
注意,mpstat不是系统自带
代码语言:javascript复制安装
# centOS
yum install -y sysstat
# Ubuntu
apt-get install -y sysstat
三、实时监控 - 网络
netstat:用于显示本机网络连接、运行端口、路由表等信息
代码语言:javascript复制# 拒绝显示别名,能显示数字的全部转化成数字
-n
# 仅列出有在Listen(监听)的服务状态
-l
# 显示建立相关链接的程序名
-p
# 显示tcp相关选项
-t
# 仅显示udp相关选项
-u
# 显示自动匹配接口的信息
-i
# 每隔一个固定时间,执行该 netstat命令
-c
例如:netstat -ntlp
四、实时监控 - 磁盘
iostat:对系统磁盘IO操作进行监控,它的输出主要显示磁盘的读写操作的统计信息。同时给出cpu的使用情况
代码语言:javascript复制# 输出指定要统计的磁盘设备名称
iostat -x device_name
五、万能命令
sar:系统活动情况报告,是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告。监控范围包括文件的读写情况、系统调用的使用情况、磁盘IO、CPU效率、内存使用情况、进程活动及IPC有关的活动等。
代码语言:javascript复制# 所有报告的总和
-A
# CPU利用率
-u
# 进程、节点、文件和锁表状态
-v
# 系统内存使用情况
-r
# 缓冲区使用情况
-b
# 内存分页情况
-B
六、进程追踪命令
strace
代码语言:javascript复制# 跟踪指定进程
-p
# 跟踪由fork子进程系统调用
-f
# 统计每次调用执行时间、出错次数等
-c
# 默认strace将结果输出到stdout。通过-o可以讲输出写入到filename文件中
-o filename