上节回顾
- ltrace命令:用于跟踪进程调用的库函数。它可以帮助开发人员了解程序在运行时调用了哪些库函数,从而帮助排查问题。
- 应用举例:如果一个程序崩溃了,使用ltrace可以查看程序在崩溃前调用了哪些库函数,以确定可能的故障点。
- strace命令:用于跟踪进程的系统调用。与ltrace相比,strace关注的是系统调用层面。
- 应用举例:当服务器响应缓慢时,使用strace可以查看进程正在执行哪些系统调用,以判断是否有I/O操作导致延迟。
- PID(进程ID):进程的唯一标识符。
- 应用举例:如果需要监控或管理特定的进程,可以通过PID来指定进程。
- 输出重定向(>):使用
>
将命令的输出重定向到文件中。- 应用举例:
ltrace -p [PID] > output.log
将ltrace的输出保存到output.log文件中。
- 应用举例:
- 进程优先级(nice):使用
nice
命令可以调整进程的优先级。- 应用举例:对于不太重要的后台任务,可以使用
nice
命令降低其优先级,以避免影响系统的整体性能。
- 应用举例:对于不太重要的后台任务,可以使用
- PSTree(pstree):显示进程的树状结构。
- 应用举例:使用
pstree
可以快速查看进程之间的父子关系,帮助理解系统的进程结构。
- 应用举例:使用
- GDB:GNU调试器,用于调试程序。
- 应用举例:如果程序崩溃,可以使用GDB来分析崩溃的原因。
- 进程管理:包括杀进程、调整优先级、查看进程状态等。
- 应用举例:如果一个进程占用了过多的CPU或内存资源,可以使用
kill
命令终止它。
- 应用举例:如果一个进程占用了过多的CPU或内存资源,可以使用
- 前台/后台切换:使用
CTRL+Z
将进程暂停,使用bg
将其放到后台,fg
将其放到前台。- 应用举例:如果需要暂停当前正在终端运行的进程以进行其他操作,可以使用
CTRL+Z
,完成后用fg
将其恢复。
- 应用举例:如果需要暂停当前正在终端运行的进程以进行其他操作,可以使用
- nohup:允许程序在后台运行并忽略挂起信号。
- 应用举例:
nohup long-running-process &
允许一个长时间运行的进程在后台运行,即使关闭终端也不会停止。
- 应用举例:
- screen:允许用户在一个终端窗口中启动多个会话。
- 应用举例:使用
screen
可以在一个终端中打开多个窗口,进行多任务操作,而不中断当前的工作。
- 应用举例:使用
- 负载(load):文档最后提到了负载,这通常指的是系统的平均负载,它反映了系统在过去一段时间内活跃的进程数量。
- 应用举例:通过监控系统的平均负载,可以判断系统是否过载,并采取相应措施,如增加资源或优化程序。
平均负载(load average)
- 平均负载的定义:
- 平均负载不是CPU使用率,而是衡量系统繁忙程度的一个综合指标,包括CPU和IO的繁忙。
- 平均负载的查看方式:
- 使用
uptime
命令可以查看系统的平均负载。 - 通过
cat /proc/loadavg
也能查看平均负载。
- 使用
- 平均负载的计算:
- 平均负载是单位时间内系统处于可运行状态®和不可中断状态(D)的平均进程数。
- 平均负载的数值除以CPU的核心数,得到的结果用于判断系统的繁忙程度
- 负载数值除以CPU核心数后,如果结果大于1,尤其是乘以70%后(即0.7倍),则表明系统可能开始变慢。
- 网络上常见的临界点是5,这通常基于两颗四核CPU的情况,即8核心,临界点为8乘以70%约等于5。
- 进程与CPU的关系:
- 进程需要CPU处理,当进程多于CPU核心数时,进程需要排队等待处理。
- 平均负载的临界点:
- 当平均负载的数值和CPU的核数相等时,是CPU处理进程的临界点。
- 对于两颗 8 核 CPU 来说,经验值是 5-6,实际工作中可能在 5-8 之间。
- 平均负载的实例比喻:
- 将CPU比作打饭的阿姨,进程比作排队打饭的学生,形象说明了进程与CPU的关系。
- 平均负载的三个时间尺度:
- 1分钟、5分钟和15分钟的平均负载,分别表示不同时间尺度内的系统繁忙程度。
- 可运行状态和不可中断状态:
- 可运行状态的进程是正在使用CPU或等待CPU的进程。
- 不可中断状态的进程是一旦中断可能会带来问题的进程,如磁盘IO操作。
- 平均负载的实际应用:
- 当平均负载高于CPU核心数时,系统可能会变得缓慢,因为进程需要排队等待CPU处理。
- 平均负载 与 CPU 使用率 的区别:
- 平均负载不仅体现了 CPU 的繁忙程度,也体现了 I/O 等其他资源的繁忙程度。
- CPU 使用率只反映 CPU 在过去一段时间内被占用的百分比,而平均负载则反映了 CPU 在过去一段时间内处理的进程数。
- 平均负载 的影响因素:
- 运行中的进程数:进程数越多,平均负载越高。
- 进程的 I/O 密集程度:I/O 密集型进程会占用更多的 I/O 资源,导致平均负载升高。
- 系统配置:CPU 核数、内存容量、磁盘 I/O 性能等因素都会影响平均负载。
实际应用举例说明:
假设你管理着一个拥有两个8核CPU的服务器,根据文档中的讲解,你可以这样应用这些知识点:
- 监控系统状态:定期使用
uptime
命令来监控服务器的平均负载,以确保系统运行平稳。 - 性能评估:如果
uptime
显示的平均负载接近或超过16(两个8核CPU的临界点),则可能需要考虑优化应用程序或增加硬件资源。 - 故障排查:如果服务器响应变慢,检查1分钟、5分钟和15分钟的平均负载,以确定系统繁忙的持续时间和影响范围。
- 系统优化:根据平均负载的变化,可能需要调整应用程序的并发级别或优化数据库查询,以减少CPU和IO的负载。
- 资源规划:在设计系统时,考虑到平均负载与CPU核心数的关系,合理规划CPU资源,以应对高负载情况。
通过这些知识点和实际应用的举例说明,可以更好地理解和管理Linux系统中的平均负载,确保系统的高效运行。
Linux系统中运行级别
- 运行级别的定义:
- 运行级别是Linux启动时处于的不同状态的标识,用于描述系统的不同运行模式。
- 传统的运行级别:
- 在System V(System Five)和旧版的Linux系统中,运行级别用数字0-7表示,每个数字对应一种特定的系统状态。
- 运行级别的具体含义:
- 0:关机
- 1:单用户模式(维护模式)
- 2:多用户,没有网络
- 3:多用户,有网络(全文本模式)
- 4:未用,保留给用户自定义
- 5:多用户,有网络,图形界面
- 6:重启
- Systemd的运行级别:
- 对于使用Systemd的现代Linux系统,运行级别用
.target
文件表示,如poweroff.target
、reboot.target
等。
- 对于使用Systemd的现代Linux系统,运行级别用
- 查看当前运行级别:
- 可以使用特定的命令或查看特定的目录来确定当前系统的运行级别。
- 使用
systemctl set-default
命令来设置默认的运行级别。例如,要将图形界面设置为默认,可以使用systemctl set-default graphical.target
。 - 在Systemd中,可以通过查看
/etc/systemd/system/
目录下的.target
文件来了解系统支持的运行级别。 - 除了
systemctl get-default
命令外,还可以使用runlevel
命令来查看系统的上一个和当前运行级别
- 运行级别的切换:
- 在传统系统中,可以通过init命令切换运行级别。在Systemd系统中,可以使用systemctl命令来切换或查看运行级别。
- 在CentOS 6中使用
init
命令,如:init 5
切换到图形界面。 - 在CentOS 7中使用
systemctl
命令,如:systemctl set-default multi-user.target
设置默认运行级别。
实际应用举例说明:
假设你是一个系统管理员,需要根据不同的任务来切换系统的运行级别:
- 系统维护:当需要对系统进行维护或需要重置root密码时,可以将系统切换到单用户模式(运行级别1)。
- 服务部署:在部署网络服务时,确保系统处于多用户模式(运行级别2或3),以允许多个用户同时访问系统资源。
- 图形界面使用:如果需要使用图形界面进行工作,可以将系统切换到图形模式(运行级别5)。
- 系统重启:在完成系统更新或配置更改后,可能需要重启系统。在这种情况下,可以切换到重启模式(运行级别6)。
- 系统关机:在需要关闭系统进行硬件维护或节能时,可以将系统切换到关机状态(运行级别0)。
- 查看当前运行级别:使用命令
systemctl get-default
可以查看当前系统的默认运行级别,使用systemctl list-units --type=target
可以查看所有可用的运行级别目标。 - 运行级别的切换:使用命令
systemctl isolate <target>
可以切换到指定的运行级别目标,例如systemctl isolate multi-user.target
切换到多用户模式。
systemd
- systemd的定义:
- systemd是一个系统和服务管理器,用于初始化Linux系统。
- systemd作为第一个进程:
- 在使用systemd的系统中,systemd是第一个运行的进程(PID为1),取代了之前的init进程。
- systemd的优势:
- 提供了一种更加高效和现代化的方式来管理系统和服务。
- 传统的init系统的局限性:
- 启动时间长,因为它是串行执行的,即一个进程启动完毕后才会启动下一个进程。
- systemd的并行执行:
- systemd支持并行启动进程,无论是否存在依赖关系,这显著减少了系统启动时间。
- systemd的管理命令:
- systemd通过统一的命令集简化了系统和服务的管理。
- systemd的依赖关系管理:
- 即便存在依赖关系,systemd也能有效地管理,允许有依赖的服务在准备好后立即启动。
- systemd的适用性:
- 对于习惯了旧init系统的运维人员,systemd可能需要一段时间来适应,但对于新手来说,它的设计更为友好。
实际应用举例说明:
假设你是一个系统管理员,需要维护和启动一个Linux服务器:
- 系统启动优化:使用systemd,你可以并行启动多个服务,而不是逐个启动,这在系统启动时大幅减少了等待时间。
- 服务管理:通过systemd,你可以使用如
systemctl start
、systemctl stop
等命令来管理服务,而不需要记住多个复杂的脚本或命令。 - 系统关机和重启:systemd提供了如
systemctl poweroff
、systemctl reboot
等命令来控制系统的关机和重启。 - 查看系统状态:使用
systemctl status
命令可以查看服务的状态,了解服务是否正在运行以及它们的日志信息。 - 依赖性管理:如果你有一个服务依赖于另一个服务,systemd允许你定义这些依赖关系,确保服务按正确的顺序启动。
- 系统更新:在进行系统更新时,systemd可以帮助你管理更新过程中的服务状态,确保更新不会意外中断关键服务。
- 自定义启动目标:通过定义
.target
文件,你可以创建自定义的启动环境,例如一个包含特定服务集合的目标,以满足特定的使用场景。
通过使用systemd,系统管理员可以更加高效地管理Linux系统的启动流程和日常服务操作,提高系统的稳定性和响应速度。
C6(System V)和C7(Systemd)启动方式的比较
- System V(C6)启动方式:
- 使用
/etc/init.d/
路径下的脚本进行服务管理,这是传统的启动方式。
- 使用
- Systemd(C7)启动方式:
- 服务的启动命令放置在特定的目录下,例如
/etc/systemd/system/
或/usr/lib/systemd/system/
。
- 服务的启动命令放置在特定的目录下,例如
- 运行级别的启动文件:
- 在System V中,不同运行级别对应的启动文件放置在
/etc/rc.d/
下,每个级别(如2、3、5)都有相应的启动脚本。
- 在System V中,不同运行级别对应的启动文件放置在
- Systemd的服务单元:
- 在Systemd中,服务被称为单元(unit),它们的配置文件以
.service
为后缀,放置在特定的目录下。
- 在Systemd中,服务被称为单元(unit),它们的配置文件以
- 启动级别的选择:
- 在System V中,选择不同的运行级别会加载相应级别下的启动文件和服务。
- 在Systemd中,选择不同的目标(target)会加载一组定义好的服务单元。
- 命令的等价性:
- 在C6中,
service
命令用于启动、停止或重启服务,而在C7中,systemctl
命令用于管理服务单元。
- 在C6中,
- 网络服务的重启:
- 在C6中,可以使用
service network restart
来重启网络服务。 - 在C7中,等价的操作是
systemctl restart network.service
。
- 在C6中,可以使用
实际应用举例说明:
假设你是一个系统管理员,需要管理Linux服务器上的服务:
- 服务管理:在C6系统中,你可能使用
/etc/init.d/networking restart
来重启网络服务。在C7系统中,你将使用systemctl restart network.service
。 - 启动级别的切换:在C6系统中,你可以通过修改
/etc/inittab
文件来改变系统的默认运行级别。在C7系统中,使用systemctl set-default
命令来设置默认的目标。 - 查看服务状态:在C6系统中,使用
service --status-all
可以查看所有服务的状态。在C7系统中,使用systemctl status <unit_name>
可以查看特定服务单元的状态。 - 系统启动过程:在C6系统中,系统按照运行级别的顺序执行
/etc/rc.d/
下的脚本。在C7系统中,系统按照定义的依赖关系并行或串行执行服务单元。 - 自定义启动行为:在C6系统中,你可能需要编辑
/etc/rc.local
来添加自定义的启动命令。在C7系统中,你可以创建自定义的服务单元文件来定义启动时运行的命令。 - 系统更新:在使用C6的系统中,更新可能涉及手动更新
/etc/init.d/
下的脚本。在使用C7的系统中,更新可以通过systemctl daemon-reload
来重新加载服务单元文件。
通过了解C6和C7的启动方式,系统管理员可以更有效地管理服务,无论是在传统的System V环境中还是在现代的Systemd环境中。
systemd使用
systemctl
命令:- 是Systemd系统管理器的命令行工具,用于管理系统和服务。
- 服务管理:
- 使用
systemctl start
启动服务,systemctl stop
停止服务,systemctl restart
重启服务。
- 使用
- 配置重新加载:
- 使用
systemctl reload
重新加载服务的配置,而不重启服务。
- 使用
- 服务状态检查:
- 使用
systemctl status
查看服务的当前状态,如active
表示正在运行,inactive
表示未运行。
- 使用
- 服务的启用与禁用:
- 使用
systemctl enable
设置服务开机自启,systemctl disable
禁止服务开机自启。
- 使用
- 查看所有自启动服务:
- 使用
systemctl list-unit-files --type=service --state=enabled
可以查看所有设置为自启动的服务。
- 使用
- 服务状态描述:
loaded
:服务单元的配置文件已经被处理。active (running)
:服务正在运行。inactive (dead)
:服务已停止。enabled
:服务设定为开机运行。disabled
:服务设定为开机不运行。
- 软链接原理:
enable
和disable
命令实际上是创建或移除软链接(symbolic link),这些软链接位于特定的目录,如/etc/systemd/system/
。
- 启动目标(target):
- Systemd使用目标(.target)来定义启动级别,例如
multi-user.target
或graphical.target
。
- Systemd使用目标(.target)来定义启动级别,例如
- 手动管理软链接:
- 管理员可以手动创建或删除软链接来控制服务在特定目标下的启动行为。
实际应用举例说明:
假设你是一个系统管理员,需要管理Linux服务器上的服务:
-
启动定时任务服务:使用命令
systemctl start crond.service
来启动定时任务服务。 -
查看服务状态:使用命令
systemctl status crond.service
来查看crond服务是否正在运行。 -
设置服务自启动:使用命令
systemctl enable crond.service
来设置crond服务开机时自动启动。 -
禁用服务自启动:使用命令
systemctl disable crond.service
来禁止crond服务开机自启动。 -
重新加载服务配置:对服务进行了配置更改后,使用
systemctl reload crond.service
应用新的配置。 -
管理软链接:如果需要手动控制服务的启动行为,可以手动创建或删除相应的软链接。例如,使用
ln -s '/usr/lib/systemd/system/crond.service' '/etc/systemd/system/multi-user.target.wants/'
创建软链接,使服务在多用户目标下启动。 -
切换运行级别:通过启用或禁用特定的
.target
文件,可以控制系统在启动时进入的运行级别。 -
禁用不需要的服务:如果服务器不需要图形界面,可以使用
systemctl disable graphical.target
来禁用图形界面的自启动。 -
确保网络连接:使用
systemctl enable network.service
确保网络服务在系统启动时自动启动,以保证网络连接。 -
管理日志服务:使用
systemctl status syslog.service
查看日志服务的状态,确保系统日志可以正常记录。 -
远程连接服务:如果服务器需要远程管理,确保SSH服务(如
sshd.service
)被设置为开机自启动。 -
服务优化:通过
systemctl list-unit-files --type=service --state=enabled
查看所有自启动服务,然后根据服务器的用途禁用不必要的服务,如systemctl disable <unnecessary-service>
。 -
网络服务的特殊情况:如果发现网络服务没有通过
systemctl
命令直接启动,可能需要使用传统的chkconfig
命令来管理,如chkconfig network on
。