本篇深入介绍Linux进程调优.
1. Linux系统进程类型:
Linux的进程可能有成千上万个:
新建状态:进程刚刚被创建,但尚未运行。
就绪状态:进程已经准备好运行,等待CPU分配。
运行状态:进程正在CPU上执行。
等待状态:进程等待某个事件或资源,如I/O操作完成。
终止状态:进程已经结束,等待系统回收资源。
Linux系统进程状态有以下几种:
可中断的睡眠状态(S浅度睡眠状态):进程正在等待某个事件或资源,可以被信号或中断唤醒。
不可中断的睡眠状态(D深度睡眠状态):进程正在等待磁盘I/O或其他硬件操作完成,无法被中断。
停止状态(T):进程已经被停止执行,通常是因为接收到了某种信号而停止。
进程跟踪状态(t):用于调试和跟踪进程。
进程之间也是有着错综复杂的关系的,我们可以用pstree来查看进程结构:
2. 进程优先级调整
nice 值和 renice 命令:
--nice 值是一个进程的优先级调整参数,范围从 -20 到 19,数值越低优先级越高。默认情况下,新进程的 nice 值为 0。
--使用nice命令可以在启动新进程时指定 nice 值。例如:
nice -n 10 myprogram
//将以 nice 值为 10 启动myprogram
--使用renice命令可以调整正在运行的进程的 nice 值。例如:
renice -n 5 -p [进程 ID]将指定进程的 nice 值调整为 5。
实时进程优先级:
--Linux 还支持实时进程,实时进程的优先级高于普通进程。实时进程的优先级范围从 0 到 99,数值越低优先级越高。
--使用sched_setscheduler系统调用可以将进程设置为实时进程。这需要在程序中使用特定的编程接口进行设置,通常只有特定的应用场景才需要使用实时进程。
3. 进程资源限制
ulimit 命令:
--ulimit命令可以限制用户或进程的资源使用。例如,可以使用ulimit -n查看当前用户可以打开的最大文件描述符数量,使用ulimit -n [新的限制值]可以设置新的限制。
--可以在 shell 启动脚本(如.bashrc或.profile)中设置ulimit参数,以确保用户在每次登录时都有特定的资源限制。
cgroups(Control Groups):
--cgroups 是 Linux 内核提供的一种机制,可以对一组进程的资源使用进行限制和管理。
--可以使用 cgroups 限制进程的 CPU、内存、磁盘 I/O 等资源的使用。例如,可以限制一组进程使用的 CPU 时间份额,防止某个进程过度占用 CPU 资源。
--通过修改/sys/fs/cgroup/[资源类型]/[控制组名称]/[参数文件]中的值来设置资源限制。例如,要限制一个控制组中的进程使用的 CPU 时间份额,可以修改/sys/fs/cgroup/cpu/[控制组名称]/cpu.cfs_quota_us和cpu.cfs_period_us文件。
4. 进程调度优化
内核调度算法:
--Linux 内核提供了几种进程调度算法,如完全公平调度算法(CFS)和实时调度算法。
--可以通过调整内核参数来影响调度算法的行为。例如,可以调整/proc/sys/kernel/sched_min_granularity_ns和/proc/sys/kernel/sched_wakeup_granularity_ns参数来控制 CFS 调度器的时间粒度,减少不必要的上下文切换。
进程绑定 CPU 核心:
--使用taskset命令可以将特定的进程绑定到特定的 CPU 核心上,避免进程在不同核心之间频繁切换,减少上下文切换开销。例如,taskset -c 0,1 myprogram将myprogram绑定到 CPU 核心 0 和 1 上。
5. 进程监控和分析
top、htop 等工具:
--top和htop是常用的系统监控工具,可以实时显示系统中进程的资源使用情况,包括 CPU 使用率、内存使用量、磁盘 I/O 等。
--通过这些工具可以快速了解系统中哪些进程占用了较多的资源,以便进行优化。
strace 和 ltrace 命令:
--strace命令可以跟踪进程的系统调用,帮助了解进程在运行过程中与操作系统的交互情况。
--ltrace命令可以跟踪进程的库函数调用,有助于分析进程的行为和性能瓶颈。
perf 工具:
--perf是 Linux 内核提供的性能分析工具,可以对系统和应用程序的性能进行详细的分析。
--可以使用perf top查看系统中最耗时的函数,使用perf record和perf report进行更深入的性能分析。
6. 进程调优需要注意的事项
谨慎调整优先级和资源限制:
--过高或过低的优先级可能会导致某些进程无法获得足够的资源,影响系统的整体性能和稳定性。在调整进程优先级和资源限制时,需要根据实际情况进行测试和调整,避免出现资源竞争或饥饿问题。
考虑应用程序的特性:
--不同的应用程序对资源的需求和行为可能不同。在进行进程优化时,需要考虑应用程序的特性,例如是否是 CPU 密集型、内存密集型或 I/O 密集型,以便采取合适的优化措施。
监控和调整:
进程优化是一个持续的过程,需要不断地监控系统性能和进程行为,根据实际情况进行调整。可以使用各种监控工具和性能分析工具,及时发现问题并采取相应的优化措施。
结合不同应用特点做调整:
比如Oracle和Mysql,还有一些java应用,它们都有许多的后台进程,需要结合各自的作用做谨慎调整。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。