# 在 Ubuntu 18.04 上查看指定时间系统负载情况

在 Ubuntu 18.04 上查看昨晚 20 点左右的系统负载情况，通常我们需要依赖一些工具来分析和查看历史性能数据。以下是几种方法，可以帮助你获取所需的信息：

### 1. **使用 `sar`（System Activity Reporter）**

`sar` 是一个非常强大的系统性能监控工具，可以查看历史负载情况。首先，你需要确保 `sysstat` 包已安装，因为 `sar` 工具包含在这个包里。

**安装 `sysstat` 包**：

```bash
sudo apt update
sudo apt install sysstat

```

**启用 `sysstat` 服务**：  
默认情况下，`sysstat` 可能没有启用收集数据，你需要启用该服务：

```bash
sudo systemctl enable sysstat
sudo systemctl start sysstat

```

**查看负载数据**：  
`sar` 默认每 10 分钟收集一次数据，数据会存储在 `/var/log/sysstat/` 目录下。你可以使用以下命令查看负载数据：

```bash
sar -u -f /var/log/sysstat/sa<day_of_month> -s <start_time> -e <end_time>

```

例如，如果你想查看昨天（假设是 7 月 22 日）晚上 20:00 到 20:30 的 CPU 使用情况：

```bash
sar -u -f /var/log/sysstat/sa22 -s 20:00:00 -e 20:30:00

```

**其他常见的 `sar` 参数**：

- `-u`：查看 CPU 使用情况。
- `-r`：查看内存使用情况。
- `-q`：查看队列长度（负载情况）。

### 2. **使用 `uptime` 和 `w`**

如果你只关心系统的负载而不关心其他细节，可以使用 `uptime` 或 `w` 命令来查看系统的当前负载情况。虽然这些工具不提供历史数据，但可以用来查看当前的负载状态。

- 查看当前系统负载：
    
    ```bash
    uptime
    
    ```
- 查看当前登录用户和负载：
    
    ```bash
    w
    
    ```

这些工具展示的信息通常包括系统负载、用户数和最近活动。

### 3. **查看 `/var/log/syslog` 或 `dmesg`**

`syslog` 文件和 `dmesg` 输出中有一些系统负载的间接信息。如果有异常情况（比如系统负载过高时），这些日志可能会记录相关的错误或警告信息。

- 查看 `/var/log/syslog`：
    
    ```bash
    grep "load" /var/log/syslog
    
    ```
- 使用 `dmesg` 查看内核日志：
    
    ```bash
    dmesg | grep "load"
    
    ```

### 4. **使用 `htop` 或 `top`（实时查看负载）**

`htop` 和 `top` 工具可以让你实时查看系统负载情况，包括 CPU 使用率、内存、进程等信息。这些工具只会显示当前的负载，但对于实时监控有很大帮助。

- 安装 `htop`（如果没有安装）：
    
    ```bash
    sudo apt install htop
    
    ```
- 启动 `htop`：
    
    ```bash
    htop
    
    ```
- 或者使用 `top`（默认工具）：
    
    ```bash
    top
    
    ```

### 5. **使用 `atop`（适用于高级负载分析）**

`atop` 是另一个非常强大的性能监控工具，可以提供更为详细的历史性能数据，类似于 `sar`，但提供了更多的性能指标。

**安装 `atop`**：

```bash
sudo apt install atop

```

**查看历史负载**：  
`atop` 会将每分钟的系统性能数据保存在 `/var/log/atop/` 目录中。你可以使用以下命令查看指定日期的数据：

```bash
atop -r /var/log/atop/atop_<date>.gz

```

例如，查看 7 月 22 日的负载数据：

```bash
atop -r /var/log/atop/atop_2025-07-22.gz

```

### 6. **使用 `journalctl` 查看系统日志**

`journalctl` 是 `systemd` 的日志查看工具，它可以提供关于系统负载的详细日志信息，特别是在 `systemd` 日志中记录的服务崩溃、资源消耗等事件。

- 查看指定时间段的系统日志：
    
    ```bash
    journalctl --since "2025-07-22 20:00:00" --until "2025-07-22 20:30:00"
    
    ```
- 如果你想查看所有负载相关的日志：
    
    ```bash
    journalctl | grep "load"
    
    ```

---

从你的输出信息来看，`sysstat` 服务已经启用并正在运行，但 `sar` 无法找到历史数据文件。出现的错误 `Cannot open /var/log/sysstat/sa23: No such file or directory` 表示当前没有收集到 `sa23` 文件，这是因为 `sysstat` 收集的数据文件是按天生成的，而目前没有历史数据文件。

### 解决方案：

1. **等待数据收集**  
    `sysstat` 会每隔一段时间（默认每 10 分钟）收集一次数据并保存到 `/var/log/sysstat/` 目录下的 `sa<day_of_month>` 文件中。因为你的 `sysstat` 服务刚刚启动，所以在这个月（23号）之前没有历史数据。如果你需要查看今天的历史数据，你必须等一段时间，直到它开始收集数据。
    
    你可以使用以下命令查看 `/var/log/sysstat/` 目录：
    
    ```bash
    ls /var/log/sysstat/
    
    ```
    
    如果数据收集顺利，它将在该目录下生成名为 `sa23`（23号）的文件。你可以稍后使用 `sar` 查看数据：
    
    ```bash
    sar -u -f /var/log/sysstat/sa23
    
    ```
2. **手动触发数据收集**  
    你也可以手动触发 `sysstat` 数据收集，但通常它是自动运行的。如果你急需当前负载数据并希望它立刻记录，可以使用以下命令手动触发 `sadc`（系统活动数据收集器）：
    
    ```bash
    sudo sadc -S DISK 1 /var/log/sysstat/sa$(date +\%d)
    
    ```
    
    这条命令会立即收集当前的数据，并将其存储为当天的 `sa<day>` 文件。随后，你就可以使用 `sar` 来查看该数据。
3. **实时监控（`sar`）**  
    目前，你可以使用 `sar` 的实时监控模式查看当前的 CPU 使用情况。你已经尝试了 `sar -u 1 5` 来查看实时的 CPU 使用情况。此命令每秒钟输出一次系统负载数据。
    
    你也可以用以下命令来监控其它资源：
    
    ```bash
    sar -r 1 5  # 查看内存使用情况
    sar -q 1 5  # 查看负载队列和上下文切换情况
    
    ```
4. **查看 `sysstat` 配置**  
    你可以查看 `/etc/default/sysstat` 文件，确保它设置为正确的启用模式：
    
    ```bash
    sudo nano /etc/default/sysstat
    
    ```
    
    确保以下内容：
    
    ```bash
    ENABLED="true"
    
    ```
5. **重新启动 `sysstat` 服务**  
    如果你在配置中做了任何更改，或者数据收集似乎没有正常工作，你可以尝试重新启动 `sysstat` 服务：
    
    ```bash
    sudo systemctl restart sysstat
    
    ```

### 结论

- 当前 `sysstat` 数据收集还没有历史数据，因为数据收集刚启用。你可以等一段时间，等待 `sar` 收集到新的数据文件。
- 如果急需查看负载情况，使用 `sar -u 1 5` 来查看实时数据。
- 确保 `sysstat` 服务正确配置并已启动。

等待一段时间后，你应该能够查看到数据文件并使用 `sar` 查看历史性能数据。

是的，`sar` **可以只查看指定网卡（如 `eth0`）的记录**，你只需加上 `grep` 或使用 `awk` 过滤，或用 `sadf` 工具格式化提取。

---

## ✅ 方法一：使用 `sar -n DEV` + `grep eth0`

如果你在查看实时或历史文件时：

```bash
sar -n DEV -f /var/log/sysstat/sa24 | grep 'eth0'

```

示例输出：

```
10:05:01 AM      eth0      1.06      0.82      0.11      0.06      0.00      0.00      0.53      0.00
10:15:01 AM      eth0    106.82     25.62    127.40     30.38      0.00      0.00      0.45      0.10
Average:         eth0     21.39      5.11     25.31      5.99      0.00      0.00      0.44      0.02

```

---

## ✅ 方法二：用 `awk` 精确输出时间和带宽（比如 `rxkB/s` 和 `txkB/s`）

```bash
sar -n DEV -f /var/log/sysstat/sa24 | awk '$3=="eth0" {print $1, $2, $6, $7}'

```

示例输出：

```
10:05:01 AM 0.11 0.06
10:15:01 AM 127.40 30.38
Average:    25.31 5.99

```

> 其中 `$6` 和 `$7` 分别是 `rxkB/s` 与 `txkB/s`（接收/发送速度）

---

## ✅ 方法三：用 `sadf` 以 CSV / JSON / JSON-pretty 格式提取 eth0

```bash
sadf -d /var/log/sysstat/sa24 -- -n DEV | grep '"eth0"'

```

或者格式化为 JSON：

```bash
sadf -j /var/log/sysstat/sa24 -- -n DEV | jq '.sysstat.hosts[0].statistics[] | select(.network_iface.iface=="eth0")'

```

这样方便你用脚本分析。

---

## ✅ 小技巧：仅显示某时间段的 eth0 流量

比如查看 `09:00` 到 `11:00`：

```bash
sar -n DEV -s 09:00:00 -e 11:00:00 -f /var/log/sysstat/sa24 | grep eth0

```

---

### 总结

<table id="bkmrk-%E7%9B%AE%E6%A0%87-%E5%91%BD%E4%BB%A4-%E6%9F%A5%E7%9C%8B-eth0-%E6%89%80%E6%9C%89%E8%AE%B0%E5%BD%95-%60"><thead><tr><th>目标</th><th>命令</th></tr></thead><tbody><tr><td>查看 eth0 所有记录</td><td>`sar -n DEV -f /var/log/sysstat/saXX</td></tr><tr><td>提取 rx/tx 速率</td><td>`awk '$3=="eth0" {print $1, $2, $6, $7}'`</td></tr><tr><td>精确时间段</td><td>`sar -s HH:MM:SS -e HH:MM:SS`</td></tr><tr><td>JSON / CSV 格式分析</td><td>`sadf -j` / `sadf -d`</td></tr></tbody></table>

---

如果你想生成图表（比如 CSV 出图）或自动脚本日报，我可以继续帮你写。是否需要？

我们可以用 `sar` + `awk` + `gnuplot` 来每日生成 **eth0 的 rx/tx 带宽折线图**，并自动生成日报（HTML 或 PDF 都可以）。

以下是完整方案（适用于 Ubuntu 18.04）：

---

## ✅ 一、准备环境

```bash
sudo apt update
sudo apt install sysstat gnuplot

```

---

## ✅ 二、脚本：生成带宽折线图 + 简要日报（HTML）

假设我们统计 `eth0` 网卡数据：

### 脚本 `/usr/local/bin/gen_net_report.sh`

```bash
#!/bin/bash

# 日期变量
DATE=$(date +%d)
FILE="/var/log/sysstat/sa$DATE"
TMPDIR="/tmp/net_report"
mkdir -p "$TMPDIR"

# 数据文件
DATFILE="$TMPDIR/net_data.dat"
PNGFILE="$TMPDIR/net_usage_$DATE.png"
HTMLFILE="$TMPDIR/net_usage_$DATE.html"

# 生成 rx/tx 数据文件
sar -n DEV -f "$FILE" | awk '$3=="eth0" && $1 ~ /[0-9]/ {print $1, $2, $6, $7}' > "$DATFILE"

# 生成 gnuplot 脚本
GNUPLOT_SCRIPT="$TMPDIR/plot_script.gp"
cat > "$GNUPLOT_SCRIPT" <<EOF
set terminal png size 1000,600
set output "$PNGFILE"
set title "Network Usage (eth0) - $DATE"
set xdata time
set timefmt "%I:%M:%S %p"
set format x "%H:%M"
set xlabel "Time"
set ylabel "kB/s"
set grid
plot "$DATFILE" using 1:3 title "rxkB/s" with lines lw 2 lt rgb "blue", \
     "$DATFILE" using 1:4 title "txkB/s" with lines lw 2 lt rgb "red"
EOF

# 执行 gnuplot
gnuplot "$GNUPLOT_SCRIPT"

# 生成 HTML 简报
cat > "$HTMLFILE" <<EOF
<html>
<head><title>Network Daily Report - eth0</title></head>
<body>
<h2>Network Usage Report - $(date '+%Y-%m-%d')</h2>
<p>Interface: <strong>eth0</strong></p>
<img src="net_usage_$DATE.png" alt="Network Usage">
</body>
</html>
EOF

# 输出结果提示
echo "📊 图表保存路径: $PNGFILE"
echo "📄 HTML报表路径: $HTMLFILE"

```

---

## ✅ 三、添加计划任务（每天自动运行）

编辑 crontab：

```bash
sudo crontab -e

```

加入每天早上 7 点运行：

```bash
0 7 * * * /usr/local/bin/gen_net_report.sh

```

---

## ✅ 四、结果展示（示意）

运行后将在 `/tmp/net_report/` 下生成：

- 折线图 `net_usage_25.png`
- 简易日报 HTML `net_usage_25.html`

你可将 HTML 报表放到内网服务器上，用浏览器查看。

---

## ✅ 五、可选拓展

- 改为输出 PDF（配合 `wkhtmltopdf`）
- 自动发日报邮件（`mailx`）
- 报表集成多个网卡、CPU、内存
- 每小时生成图而非每日

---

是否需要我帮你扩展为自动发邮件或支持多日历史图？

</body></html>