0%

内存利用率利用率监控脚本:自动报警与状态分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash

# 配置参数
THRESHOLD=1024 # 内存报警阈值(MB)
CHECK_INTERVAL=60 # 检查间隔(秒),如果作为定时任务可注释
MAIL="example@mail.com" # 接收报警的邮箱
LOG_FILE="/var/log/memory_monitor.log" # 日志文件路径

# 确保日志文件存在
touch $LOG_FILE
chmod 644 $LOG_FILE

# 日志函数
log() {
echo "[$(date +%F" "%H:%M:%S)] $1" >> $LOG_FILE
}

# 获取系统信息
get_system_info() {
DATE=$(date +%F" "%H:%M)
# 兼容不同版本的ifconfig输出
IP=$(hostname -I | awk '{print $1}') # 更可靠的IP获取方式
if [ -z "$IP" ]; then
IP=$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | head -1 | awk '{print $2}')
fi
}

# 获取内存信息
get_memory_info() {
# 使用更详细的内存计算方式
MEM_INFO=$(free -m | grep Mem)
TOTAL=$(echo $MEM_INFO | awk '{print $2}')
USED=$(echo $MEM_INFO | awk '{print $3}')
FREE=$(echo $MEM_INFO | awk '{print $4}')
BUFFER=$(echo $MEM_INFO | awk '{print $6}')
CACHE=$(echo $MEM_INFO | awk '{print $7}')
# 实际可用内存 = 空闲内存 + 缓冲区 + 缓存
AVAILABLE=$((FREE + BUFFER + CACHE))
# 内存使用率(百分比)
USAGE_RATE=$((USED * 100 / TOTAL))
}

# 发送报警邮件
send_alert() {
SUBJECT="内存报警: $IP 内存不足"
BODY="
服务器内存使用率过高,请及时处理!

日期时间: $DATE
服务器IP: $IP
总内存: $TOTAL MB
已用内存: $USED MB
空闲内存: $FREE MB
缓冲内存: $BUFFER MB
缓存内存: $CACHE MB
实际可用内存: $AVAILABLE MB
内存使用率: $USAGE_RATE%

报警阈值: $THRESHOLD MB
"
echo "$BODY" | mail -s "$SUBJECT" $MAIL
log "发送内存报警邮件至 $MAIL"
}

# 主函数
main() {
get_system_info
get_memory_info

# 记录内存状态
log "内存状态 - 总内存: $TOTAL MB, 已用: $USED MB, 可用: $AVAILABLE MB, 使用率: $USAGE_RATE%"

# 检查是否需要报警
if [ $AVAILABLE -lt $THRESHOLD ]; then
log "内存不足! 可用内存 $AVAILABLE MB 低于阈值 $THRESHOLD MB"
send_alert
fi
}

# 如果作为独立脚本运行,循环监控;如果作为定时任务,只运行一次
if [ "$1" != "cron" ]; then
while true; do
main
sleep $CHECK_INTERVAL
done
else
main
fi

脚本优点

  1. 精准的内存计算逻辑
    不仅简单计算表面空闲内存,还通过 实际可用内存 = 空闲内存 + 缓冲区 + 缓存 的公式,贴合 Linux 内存管理机制(缓存和缓冲区可被系统自动释放),避免误报。同时增加内存使用率百分比,直观反映内存压力。
  2. 灵活的运行模式
    支持两种运行方式:
    • 作为独立进程循环监控(适合临时值守);
    • 作为定时任务通过 crontab 运行(适合长期监控),适配不同场景需求。
  3. 完善的日志系统
    所有监控状态(正常 / 报警)均记录到日志文件,便于追溯内存变化趋势,为问题分析提供历史数据支持。
  4. 健壮的异常处理
    • 兼容不同 Linux 发行版的 IP 地址获取方式(hostname -Iifconfig 双重兼容);
    • 自动创建日志文件并设置权限,避免因文件不存在导致脚本报错。
  5. 清晰的报警信息
    报警邮件包含总内存、已用内存、缓存、使用率等详细指标,而非简单的 “内存不足” 提示,帮助运维人员快速判断问题严重程度
  6. 模块化设计
    将系统信息获取、内存计算、日志记录、邮件发送等功能拆分为独立函数,便于后续修改或增加新功能(如添加微信 / 短信报警)

使用方法

  1. 保存脚本为memory_monitor.sh
  2. 修改脚本中的配置参数(尤其是邮箱地址)
  3. 赋予执行权限:chmod +x memory_monitor.sh
  4. 运行方式:
    • 直接运行(循环监控):./memory_monitor.sh
    • 作为定时任务(添加到 crontab):*/5 * * * * /path/to/memory_monitor.sh cron

注意事项

  1. 确保系统已安装mail工具,否则需要先安装(如yum install mailx
  2. 首次使用建议测试邮件发送功能是否正常
  3. 根据服务器内存大小调整合适的报警阈值
  4. 对于生产环境,建议结合更专业的监控工具(如 Prometheus+Grafana)使用

spark连接 Hive 全指南:从配置到实战

Spark 与 Hive 的集成是大数据生态中常见的场景,Spark 提供了对 Hive 元数据和数据的无缝访问能力,允许用户通过 Spark SQL 操作 Hive 表数据。本文将详细讲解 Spark 连接 Hive 的配置步骤、访问方式及常见问题解决,帮助你快速实现两者的集成。

Spark 与 Hive 集成的核心原理

Spark 连接 Hive 的本质是通过共享 Hive 元数据实现数据访问:

  • 元数据(Metastore):Hive 的元数据存储在关系型数据库(如 MySQL)中,记录了表结构、分区信息等;
  • 数据存储:Hive 表数据通常存储在 HDFS 或对象存储(如 S3)中,格式包括 Parquet、ORC、CSV 等;
  • Spark 角色:Spark 作为计算引擎,通过读取 Hive 元数据定位数据位置,直接操作底层数据文件,替代 Hive 的 MapReduce 执行引擎。

Spark 连接 Hive 的前置条件

在配置集成前,需确保以下环境就绪:

  1. Hive 环境正常运行
    • Hive Metastore 服务已启动(负责元数据管理);
    • Hive 表数据已存储在 HDFS 或其他存储系统中。
  2. Spark 环境准备
    • 下载与 Hive 版本兼容的 Spark 发行版(推荐 Spark 2.4+ 搭配 Hive 2.3+);
    • 确保 Spark 节点能访问 Hive Metastore 和 HDFS 集群。
  3. 依赖组件
    • MySQL 驱动(Hive Metastore 若使用 MySQL 存储元数据);
    • Hadoop 配置文件(core-site.xmlhdfs-site.xml)。

Spark 连接 Hive 的配置步骤

集成 Hive 元数据配置

复制 Hive 配置文件

将 Hive 的核心配置文件复制到 Spark 的 conf 目录,确保 Spark 能读取 Hive 元数据信息:

阅读全文 »

CPU 基础知识:结构、原理与性能解析

CPU(中央处理器)是计算机的核心部件,负责执行指令、处理数据并协调系统各组件工作。其内部结构精密,通过寄存器、控制器、运算器和时钟的协同,实现对整个计算机系统的调度与运算。以下从结构组成、核心功能到性能参数进行详细解析:

CPU 的内部结构与核心组件

CPU 的核心组成包括寄存器、控制器、运算器和时钟,各部分通过内部总线连接,形成一个有机整体:

  • 寄存器:CPU 内部的高速存储单元,用于暂存指令、数据和中间结果。其容量小(通常为几十到几百个字节),但访问速度极快(纳秒级),是 CPU 与内存之间的 “缓冲站”。
  • 控制器:CPU 的 “指挥中心”,负责从内存读取指令、解析指令(确定操作类型和操作对象),并协调运算器、寄存器等部件执行指令。
  • 运算器:负责数据的算术运算(如加减乘除)和逻辑运算(如与、或、非),是 CPU 处理数据的 “加工厂”。
  • 时钟:产生周期性的时钟信号(如 3.0GHz 表示每秒产生 30 亿个时钟脉冲),控制各部件的工作节奏,确保指令执行的时序同步。

运算器:数据处理的核心单元

运算器由多个功能部件组成,协同完成数据运算与暂存:

  • 算术逻辑单元(ALU):运算器的核心,直接执行算术运算(如3+5)和逻辑运算(如a && b)。
  • 累加寄存器(AC):通用寄存器,为 ALU 提供操作数和暂存运算结果。例如,执行a + b时,AC 先存放a,与b相加后再存储结果。
  • 数据缓冲寄存器(DR):作为 CPU 与内存之间的缓冲,写内存时暂存待写入的指令或数据,读内存时暂存刚读取的内容,减少 CPU 与内存的直接交互延迟。
  • 状态条件寄存器(PSW):存储运算过程中产生的状态标志(如进位C、零标志Z、溢出V)和控制标志(如中断允许I)。例如,运算结果为 0 时,零标志Z会被置为 1,供控制器判断后续操作(如条件跳转)。

控制器:指令执行的 “指挥系统”

控制器的核心功能是取指令、译码、执行(Fetch-Decode-Execute)的循环,确保程序按顺序或条件跳转执行。其关键组件包括:

阅读全文 »

Linux 查看端口占用的两种常用方法:lsof 与 netstat

在 Linux 系统中,查看端口占用情况是排查网络服务故障(如 “端口已被占用” 错误)的基础操作。常用工具包括 lsof(列出打开的文件)和 netstat(网络状态统计),本文将详细介绍两者的用法及场景。

使用 lsof 查看端口占用

lsof(List Open Files)是一款功能强大的工具,可列出系统中所有打开的文件(Linux 中 “一切皆文件”,包括网络连接)。其核心优势是能直接关联端口与进程的详细信息。

查看指定端口的占用情况

命令格式

1
lsof -i :端口号

示例:查看 8010 端口的占用情况

1
lsof -i:8010

输出解析

1
2
3
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
nginx 35653 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)
nginx 35654 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)
阅读全文 »

MySQL 自动备份脚本详解

MySQL 备份是保障数据安全的核心手段,mysqldump 工具结合 shell 脚本可实现自动化备份,避免人工操作的疏漏。本文详细解析备份原理、脚本及还原方法,帮助构建可靠的备份策略。

mysqldump 核心参数解析

mysqldump 是 MySQL 官方备份工具,支持全库、单库、单表备份,核心参数如下:

参数 作用说明
-u <user> 指定数据库用户名。
-p <password> 指定用户密码(不建议明文写在命令中,可省略让系统交互输入)。
-h <host> 数据库主机地址(默认 localhost)。
--default-character-set=utf8 指定字符集(避免中文乱码)。
--databases <db1 db2> 备份多个数据库(需列出数据库名)。
--all-databases 备份所有数据库(包括系统库如 mysql)。
--ignore-table=<db.table> 排除指定表(如 --ignore-table=mysql.events)。
--lock-all-tables 备份前锁定所有表(读锁),确保数据一致性(会阻塞写操作,适合停机备份)。
--single-transaction 对 InnoDB 表开启事务备份(不锁表,适合在线备份,保证一致性读)。
--opt 启用优化选项(默认开启),包括 --add-drop-table--add-locks 等。

关键参数对比(锁表策略):

场景 推荐参数 优点 缺点
在线业务(不停机) --single-transaction 不阻塞写操作,适合生产环境 仅支持 InnoDB 表,MyISAM 仍会锁表
停机维护 --lock-all-tables 支持所有存储引擎,数据绝对一致 锁表期间阻塞所有写操作,影响业务

自动备份脚本

解决密码明文、日志记录、过期清理等问题:

阅读全文 »