linux常用命令熟悉及应用
1.1 通过perf工具记录10秒OS中的CPU使用,找到耗时最长的函数,找到CPU上下文切换耗时最多的进程。
启动 perf 记录:
使用 perf record 命令来收集性能数据。为了限制记录时间为 10 秒,你可以结合 timeout 命令使用,或者手动在 10 秒后停止记录(但这需要另一个终端或脚本)。这里我们使用 timeout:
sudo timeout 10 perf record -g -F 997 -a
-g:启用调用图(call graph)收集。
-F 997:设置采样频率为每毫秒采样一次(大约 1000Hz - 1 = 999Hz,但这里为了接近整秒我们稍微调低一些以避免时间偏差)。注意,实际采样频率可能受到系统限制。
-a:收集所有 CPU 上的数据。
timeout 命令会在 10 秒后自动终止 perf record。
生成报告并找到耗时最长的函数:
记录完成后,使用 perf report 命令查看报告:
sudo perf report
在报告界面中,你可以浏览各个函数的 CPU 使用情况,通常耗时最长的函数会排在顶部。你可以使用箭头键在报告中导航,并按下 q 键退出。
1.2 “date”命令可以设置系统时间,通过strace命令,记录所有打开文件的列表并输出到文件,找到系统时间设置是将数据写入哪个文件。
在Linux系统中,使用“date”命令可以设置系统时间。为了了解“date”命令设置系统时间时是将数据写入哪个文件,可以使用strace命令来跟踪其系统调用和打开的文件。
步骤概述
使用strace命令跟踪date命令:通过strace命令,我们可以记录date命令在执行过程中打开的所有文件,并观察它是否对某个文件进行了写操作,以设置系统时间。
分析strace输出:查看strace命令的输出文件,找到与设置系统时间相关的系统调用和文件操作。
具体步骤
执行strace命令:
bash
strace -e trace=open,write -o date_strace_output.txt date +"%Y-%m-%d %H:%M:%S"
这里,-e trace=open,write 选项告诉strace只跟踪open和write系统调用,-o date_strace_output.txt 选项将strace的输出重定向到文件 date_strace_output.txt 中。date -s "YYYY-MM-DD HH:MM:SS" 是我们要跟踪的date命令,用于设置系统时间。
分析输出文件:
打开 date_strace_output.txt 文件,查找与打开文件相关的输出。通常,你会看到类似于以下的输出:
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
...
open("/etc/localtime", O_RDONLY) = 5
...
write(1, "Fri Oct 6 12:34:56 UTC 2023\n", 30) = 30
open 系统调用表示打开了某个文件,而 write 系统调用表示向某个文件或设备写了数据。然而,需要注意的是,date 命令设置系统时间时,并不直接写入一个特定的文件来更改系统时间。相反,它通常通过调用内核提供的系统调用来更改系统时间。
在strace的输出中,你可能会看到 date 命令打开了 /etc/localtime 文件,这是因为它需要读取本地时区信息来正确显示和设置系统时间。但是,设置系统时间本身并不涉及写入这个文件。
实际上,date 命令(特别是当使用 -s 选项时)会通过调用 clock_settime 或类似的系统调用来更改系统时间。这些系统调用是由内核处理的,并且不直接涉及文件系统的写操作。因此,在strace的输出中,你可能不会看到与设置系统时间直接相关的文件写操作。
1.3 systemctl命令控制系统服务,理解 enable、disable、start、stop、restart等选项的功能。
# 启动nginx服务
sudo systemctl start nginx
# 停止nginx服务
sudo systemctl stop nginx
# 重启nginx服务
sudo systemctl restart nginx
# 查看nginx服务状态
sudo systemctl status nginx
# 设置nginx服务开机自启动
sudo systemctl enable nginx
# 禁用nginx服务开机自启动
sudo systemctl disable nginx
1.4 sysctl配置内核参数方法,设置内存脏页回写比例dirty ratio为50%。与之对应的设置项永久生效方法(修改对应的配置文件)
使用sysctl命令设置内存脏页回写比例为50%的方法如下:
首先,打开终端或命令行界面。
使用以下命令设置vm.dirty_ratio为50%:
sysctl -w vm.dirty_ratio=50
为了确保这个设置在系统重启后仍然有效,需要将该参数添加到/etc/sysctl.conf文件中。使用文本编辑器打开/etc/sysctl.conf文件,例如使用vi编辑器:
sudo vi /etc/sysctl.conf
在文件的末尾添加以下行:
vm.dirty_ratio = 50
保存并关闭文件。然后,运行以下命令使更改生效:
sudo sysctl -p
这样,vm.dirty_ratio参数就被设置为50%,并且在系统重启后仍然保持设置。
1.5 通过ss或netstat,查看系统打开的端口列表,能找到ssh、对应的进程和PID。
在Linux系统中,可以使用ss或netstat命令来查看系统中打开的端口列表以及与之关联的服务(如SSH服务)、对应的进程和进程ID(PID)。
使用ss命令查看:
ss -tuln
-t 表示显示TCP端口
-u 表示显示UDP端口
-l 表示显示监听状态的端口
-n 表示不解析服务名称,直接显示端口号
使用netstat命令查看:
netstat -tuln
参数与ss命令相同。
注意:netstat工具可能在某些最新的Linux发行版中不默认安装,可以使用ss命令或安装net-tools包来使用netstat。
如果你想找到特定服务(如SSH)对应的端口和进程信息,可以使用grep工具过滤输出结果。例如,使用grep过滤SSH服务:
ss -tuln | grep ssh
# 或者
netstat -tuln | grep ssh
另外,如果你想要查看特定端口(如22端口,通常为SSH服务)的详细信息,可以使用如下命令:
ss -tuln | grep ':22'
# 或者
netstat -tuln | grep ':22'
最后,如果你想要得到进程的PID,可以结合awk工具来输出PID列:
ss -tulnp | grep ssh
# 或者
netstat -tulnp | grep ssh
-p 参数用于显示监听端口的进程信息
-n 参数用于不解析服务名称
1.6 查看系统内存使用,了解free命令中,“used、free、shared、buff/cache、available”各项表示的意义,与之对应的/proc/meminfo中的项;
free 命令用于查看系统内存使用情况。它报告的内存状态包括总计、已使用、空闲、共享、缓冲/缓存和可用内存。
free -h
-h 参数使得输出的数值更易于阅读,以 K、M、G 为单位显示。
输出解释:
total:内存总量
used:已使用内存,通常情况下,这个值是(total-free-buff/cache),但是在某些情况下,used的值会比这个大,因为used还包括了buff/cache的部分
free:实际可用内存,是指没有被分配的内存
shared:共享内存,一般在多个进程共享同一段内存时会使用
buff/cache:缓冲/缓存,缓冲区是用于存储要写入磁盘的数据,缓存区是用于存储从磁盘中读取的数据
available:可用内存,考虑了应用程序的内存需求,这是近似的可用内存量,不包括交换空间
要详细了解每个指标,可以使用不带参数的free命令,或者使用free -s设置刷新间隔,或者free -t显示总计行。
free -t
1.7了解swap分区的作用,开启和关闭。
Swap分区的作用是扩展内存、防止意外崩溃,并将经常不使用的内存数据转移至Swap分区中,以释放物理内存空间。当系统内存不足时,Swap分区可以将内存中的数据暂时存储到硬盘上,从而为当前运行的程序腾出足够的内存空间。
开启和关闭Swap分区可以通过以下命令进行操作
开启Swap分区:使用swapon -a命令可以开启所有的Swap分区6。
关闭Swap分区:使用swapoff -a命令可以关闭所有的Swap分区6。
需要注意的是,关闭Swap分区可能会导致系统在内存不足时无法正常使用,因此需要根据实际情况谨慎操作。