小菜鸟

java菜鸟号正在起航

Linux 进程管理命令详解:从查看监控到进程控制

在 Linux 系统管理中,进程管理是核心技能之一。无论是排查性能问题、终止异常进程,还是监控系统负载,都需要熟练掌握进程管理命令。本文将系统介绍常用的进程查看、监控、分析及控制命令,帮助你全面掌握进程管理技巧。

进程查看命令

ps:静态查看进程快照

ps(Process Status)用于显示系统当前运行的进程快照,是最基础的进程查看工具。

常用参数组合:
  • ps aux:显示所有用户的所有进程(包括无终端的后台进程),输出详细信息。

    ps aux
  • ps -ef:以全格式显示进程信息,包含进程间的父子关系。

    ps -ef | grep java  # 查找与 Java 相关的进程
输出字段解析:
字段 含义说明
USER 进程所属用户
PID 进程唯一标识符(用于后续操作,如终止进程)
%CPU 进程占用 CPU 的百分比
%MEM 进程占用物理内存的百分比
VSZ 进程使用的虚拟内存大小(单位:KB)
RSS 进程使用的物理内存大小(单位:KB,不包含交换分区)
TTY 进程运行的终端(? 表示无终端,通常为系统进程)
STAT 进程状态(关键状态:R 运行中、S 睡眠、Z 僵尸进程、T 停止)
START 进程启动时间
TIME 进程累计占用 CPU 的时间
COMMAND 启动进程的命令(含路径和参数)
实用技巧:
  • 按资源占用排序:

    # 查看占用内存最多的前 10 个进程
    ps aux | head -1; ps aux | grep -v PID | sort -rn -k +4 | head
    
    # 查看占用 CPU 最多的前 10 个进程
    ps aux | head -1; ps aux | grep -v PID | sort -rn -k +3 | head

top:实时监控进程动态

top 命令提供动态实时的进程监控,默认每 3 秒刷新一次,适合跟踪系统资源占用变化。

基本用法:
阅读全文 »

Nginx 缓存配置详解:代理缓存与静态资源缓存策略

缓存是提升 Web 服务性能的关键技术,Nginx 作为高性能代理服务器,通过代理缓存(Proxy Cache)和客户端缓存(Expires)减少后端服务器压力,加速资源响应。本文详细讲解 Nginx 缓存的工作原理、核心配置及实战案例,帮助构建高效的缓存体系。

缓存的三种类型与 Nginx 定位

在 Web 架构中,缓存按存储位置可分为三类:

缓存类型 存储位置 作用
服务端缓存 后端服务器(如 Redis、Memcached) 缓存数据库查询结果、业务数据等
代理缓存 代理服务器(如 Nginx) 缓存后端返回的静态资源或 API 响应,减少后端重复处理
客户端缓存 浏览器本地 缓存静态资源(如图片、CSS),减少网络请求

Nginx 的角色:主要实现代理缓存,同时通过expires指令控制客户端缓存策略,是连接后端服务与客户端的 “中间缓存层”。

Nginx 代理缓存(Proxy Cache):减少后端请求

Nginx 代理缓存将后端服务器的响应数据存储在本地磁盘或内存中,当后续有相同请求时,直接返回缓存内容,无需转发至后端。

核心配置指令

代理缓存的配置需两步:先在http块定义缓存存储路径和参数(proxy_cache_path),再在location块启用缓存(proxy_cache)。

阅读全文 »

CentOS 服务开机自启配置全指南

在 CentOS 系统中,配置服务开机自启是系统管理的重要任务,确保关键服务在系统重启后能自动运行。本文将详细介绍两种主要配置方法:chkconfig 工具和 /etc/rc.local 文件,以及服务的日常管理命令。

使用 chkconfig 管理开机自启

chkconfig 是 CentOS 中传统的服务管理工具,主要用于管理 /etc/init.d/ 目录下的系统服务脚本,支持设置不同运行级别下的自启状态。

chkconfig 基本要求

要使用 chkconfig 管理服务,该服务必须满足:

  • /etc/init.d/ 目录下存在对应的启动脚本
  • 脚本中包含 chkconfig 注释块(指定默认运行级别和优先级)

检查服务脚本是否存在:

ls /etc/init.d/服务名
# 示例:检查 httpd 服务脚本
ls /etc/init.d/httpd

chkconfig 核心命令

添加服务到 chkconfig 管理
阅读全文 »

日志框架全解析:从接口到实现的完整指南

在 Java 开发中,日志是系统调试、问题排查和运行监控的核心工具。日志框架主要分为日志接口(门面)日志实现两类,前者提供统一的 API,后者负责具体的日志输出逻辑。合理选择和搭配日志框架,能在不修改业务代码的前提下灵活切换日志实现,显著提升系统的可维护性。本文将详细解析主流日志框架的分类、特点及集成方式。

日志框架的核心分类

日志框架的设计遵循门面模式(Facade Pattern):日志接口定义统一的日志操作规范,日志实现负责具体的日志输出(如控制台、文件、数据库等)。这种分离让业务代码依赖接口而非具体实现,便于后期切换日志组件。

1. 日志接口(门面)

日志接口本身不实现日志功能,仅定义一套通用的日志操作 API(如debug()info()error()等),主流接口有两个:commons-logging(JCL)slf4j

(1)commons-logging(JCL,Apache Commons Logging)
  • 特点:Apache 推出的日志门面,采用动态加载机制(运行时通过配置文件指定日志实现)。

  • 依赖:

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version> <!-- 稳定版本 -->
    </dependency>
  • 配置方式:需通过commons-logging.properties指定日志实现:

阅读全文 »

Redis 命令解析流程:以 SET 命令为例

Redis 对命令的解析和执行是其核心功能之一,涉及协议解析、参数处理、命令路由等多个环节。本文以 SET 命令为例,详细解析 Redis 如何接收、解析并执行命令。

命令解析的整体流程

Redis 处理客户端命令的流程可概括为:
接收命令数据 → 协议解析 → 填充 client 结构体 → 路由到对应命令函数 → 执行命令 → 返回结果

其中,client 结构体是贯穿全程的核心载体,记录了命令的参数、客户端状态、连接信息等关键数据。

client 结构体:命令解析的核心载体

client 结构体是 Redis 描述客户端连接和命令请求的核心数据结构,与命令解析相关的关键字段如下:

字段名 作用
argc 命令参数的数量(包含命令名本身)。例如 SET key value 中,argc=3
argv 命令参数数组(robj* 类型,robj 是 Redis 通用对象结构)。argv[0] 为命令名(如 "SET"),argv[1...] 为命令参数(如 "key""value")。
querybuf 接收客户端命令的缓冲区(sds 类型,动态字符串),存储未解析的原始命令数据。
qb_pos querybuf 中已解析的位置,用于增量解析命令。
cmd 指向当前执行的命令结构体(redisCommand 类型),包含命令的处理函数、参数个数限制等元信息。

SET 命令解析:从代码看细节

setCommand 函数为例,解析 Redis 如何处理 SET 命令:

void setCommand(client *c) {
    robj *expire = NULL;  // 过期时间对象(如 EX 30 中的 30)
    int unit = UNIT_SECONDS;  // 时间单位(秒/毫秒,默认秒)
    int flags = OBJ_NO_FLAGS;  // 命令标志(如 NX、XX 等选项)

    // 解析扩展参数(如 EX、PX、NX、XX 等)
    if (parseExtendedStringArgumentsOrReply(c,&flags,&unit,&expire,COMMAND_SET) != C_OK) {
        return;  // 解析失败,返回错误
    }

    // 对 value 进行编码优化(如转为整数编码,节省内存)
    c->argv[2] = tryObjectEncoding(c->argv[2]);

    // 调用通用设置函数执行核心逻辑
    setGenericCommand(c,flags,c->argv[1],c->argv[2],expire,unit,NULL,NULL);
}

步骤 1:解析扩展参数(parseExtendedStringArgumentsOrReply

SET 命令支持丰富的扩展选项(如 SET key value EX 30 NX),该函数的作用是解析这些选项:

阅读全文 »
0%