监控服务器内存是运维和开发中的常见任务,根据不同的使用场景(临时查看、持续监控、告警设置),有几种主流的方法。
下面我将从命令行快速查看、使用现成工具、配置告警以及代码示例几个维度来介绍。
1. 命令行快速查看(Linux/Unix 系统)
这是最直接的方法,用于登录服务器后快速了解内存状态。
free -h
-h:以人类可读的格式(GB/MB)显示。
- 输出说明:
total:总内存大小。
used:实际已被使用的内存。
free:完全空闲的内存(通常很小,因为Linux会用空闲内存做缓存)。
shared:共享内存(通常可忽略)。
buff/cache:用于磁盘缓存和缓冲区占用的内存,这部分在需要时可以被应用程序回收。
available:这是最关键指标,表示新程序在不启用交换分区(Swap)的情况下,可以从系统获得的内存大小,如果这个值接近0,说明内存紧张。
top 或者安装 htop(更直观) htop
- 在top 界面中,按Shift + M 可以按内存使用率对进程排序。
- 关注%MEM 列,查看哪个进程是内存大户。
vmstat 1 5
- 每隔1秒输出一次内存统计,共5次。
- 关注swpd(当前使用的交换内存大小)、free(空闲内存)和cache(缓存)。
查看/proc/meminfo(最详细)
cat /proc/meminfo
- 可以看到内核最原始的内存统计数据,如MemTotal,MemFree,MemAvailable,SwapTotal,SwapFree 等。
2. 使用专业监控工具(推荐用于生产环境)
如果需要持续监控并查看历史趋势,建议使用以下工具:
htop /glances(增强版Top)
htop:交互式进程查看器,支持彩色显示和横向/纵向滚动。
glances:一个用Python编写的更强大的工具,不仅显示CPU、内存,还显示磁盘I/O、网络等。
安装 sudo apt install htop glances 运行 glances
- 一个通用的系统资源统计工具,可以组合显示CPU、内存、磁盘、网络。
dstat --mem --cpu --disk --net
- IBM提供的工具,可以输出详细的性能报告,甚至生成图形化文件。
单纯的查看不够,你需要在内存即将耗尽时收到告警。
1、安装sysstat 包(包含sar 命令)
sudo apt install sysstat
sudo systemctl enable sysstat # 开启数据收集
sar -r -f /var/log/sysstat/saXX # 查看历史内存报告2、编写简单的告警脚本(使用crontab)
#!/bin/bash
threshold=80 # 报警阈值(百分比)
mem_used=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
if (( $(echo "$mem_used > $threshold" | bc -l) )); then
echo "Warning: Memory usage is ${mem_used}%" | mail -s "Memory Alert" admin@example.com
fi *注意:在生产环境中,通常不会只看used,而是结合available来判断。
Prometheus + Grafana + Node Exporter:
Node Exporter:采集服务器指标(包括内存),暴露HTTP接口。
Prometheus:抓取数据并存储。
Grafana:可视化展示,并支持设置告警规则(如:(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90)。
Zabbix:一套完整的监控解决方案,自带内存监控模板和告警。
Datadog / New Relic / CloudWatch:如果需要云厂商或SaaS方案,可以针对特定指标设置告警。
如果怀疑内存泄漏或OOM(Out Of Memory),可以检查系统日志:
查看是否有OOM killer杀进程的记录 sudo dmesg | grep -i oom sudo journalctl -xe | grep -i oom 查看系统日志中的内存相关错误 sudo tail -f /var/log/syslog
当系统内存耗尽时,kernel: Out of memory: Killed process ... 是典型信号。
Python 示例(使用psutil 库)
import psutil
获取内存信息
memory = psutil.virtual_memory()
print(f"总内存: {memory.total / (1024**3):.2f} GB")
print(f"已使用: {memory.used / (1024**3):.2f} GB")
print(f"可用内存: {memory.available / (1024**3):.2f} GB")
print(f"内存使用率: {memory.percent}%")
if memory.percent > 90:
print("警告:内存使用率过高!")Go 示例(使用gopsutil 库)
package main
import (
"fmt"
"github.com/shirou/gopsutil/mem"
)
func main() {
memory, _ := mem.VirtualMemory()
fmt.Printf("Total: %v GB\n", memory.Total / 1024 / 1024 / 1024)
fmt.Printf("Available: %v GB\n", memory.Available / 1024 / 1024 / 1024)
fmt.Printf("Used Percent: %.2f%%\n", memory.UsedPercent)
}1、临时查看:用free -h 或htop。
2、持续监控:部署Prometheus + Node Exporter + Grafana(开源、强大、已成为事实标准)。
3、告警阈值:关注available 而不是free,建议设置:
警告:可用内存低于总内存的20%。
严重:可用内存低于总内存的10% 或 开始大量使用Swap。
4、自动化:对于云服务器(如AWS EC2, 阿里云ECS),使用云平台自带的内存监控(CloudWatch, 云监控)。
5、排查OOM:当进程被kill时,第一时间检查dmesg 和syslog,而不是只看当前的内存使用率。
希望这些方法能帮你有效地监控服务器内存,如果需要针对某个特定工具(如Prometheus配置)的详细说明,可以继续告诉我。
文章摘自:https://idc.huochengrm.cn/fwq/25049.html
评论
充碧蓉
回复监控服务器内存可通过命令行工具如`free`、`top`等快速查看,或使用专业工具如`htop`、`glances`等持续监控,配置告警可通过系统脚本或成熟监控系统如Prometheus来实现。