主要指标

  • 磁盘空间使用率:每个挂载点的磁盘使用百分比,常用于判断磁盘是否即将耗尽。
  • 磁盘 IO 速率:磁盘的读写速率,过高的 IO 可能表示磁盘负载过重。
  • I/O 等待(I/O wait):CPU 等待磁盘 I/O 完成的时间,通常表示磁盘访问瓶颈。
#include <iostream>
#include <sys/mount.h> // macOS-specific header for statfs
#include <sys/statvfs.h>

void getDiskUsage(const char *path) {
#ifdef __linux__
  struct statvfs stat;

  if (statvfs(path, &stat) != 0) {
    std::cerr << "Error getting disk usage information (Linux)" << std::endl;
    return;
  }

  unsigned long total = stat.f_blocks * stat.f_frsize;
  unsigned long free = stat.f_bfree * stat.f_frsize;
  unsigned long available = stat.f_bavail * stat.f_frsize;
  unsigned long used = total - free;

  std::cout << "Total Disk (Linux): " << total / (1024 * 1024) << " MB"
            << std::endl;
  std::cout << "Used Disk (Linux): " << used / (1024 * 1024) << " MB"
            << std::endl;
  std::cout << "Available Disk (Linux): " << available / (1024 * 1024) << " MB"
            << std::endl;
#elif __APPLE__
  struct statfs stat;

  if (statfs(path, &stat) != 0) {
    std::cerr << "Error getting disk usage information (macOS)" << std::endl;
    return;
  }

  unsigned long total = stat.f_blocks * stat.f_bsize;
  unsigned long free = stat.f_bfree * stat.f_bsize;
  unsigned long available = stat.f_bavail * stat.f_bsize;
  unsigned long used = total - free;

  std::cout << "Total Disk (macOS): " << total / (1024 * 1024) << " MB"
            << std::endl;
  std::cout << "Used Disk (macOS): " << used / (1024 * 1024) << " MB"
            << std::endl;
  std::cout << "Available Disk (macOS): " << available / (1024 * 1024) << " MB"
            << std::endl;
#endif
}

int main() {
  getDiskUsage("/");
  return 0;
}

命令行工具

  • df:查看文件系统的磁盘使用情况。
    • 优化分析:通过 df 查看各个挂载点的磁盘使用率,判断磁盘空间是否充足。
  • du:查看指定目录或文件的磁盘使用情况。
    • 优化分析:通过 du 可以找到占用磁盘空间较大的文件或目录,方便进行清理。
  • iostat:显示磁盘的 I/O 性能,包括读取、写入速率。
    • 优化分析:通过 iostat 可以判断磁盘是否存在 I/O 性能瓶颈,发现频繁访问磁盘的进程。
  • iotop:类似于 top 的磁盘 I/O 性能监控工具,显示各进程的磁盘 I/O 使用情况。
    • 优化分析:通过 iotop 可以发现磁盘 I/O 负载重的进程,并进行优化。

优化方案

  • 清理不必要的文件:通过 du 找到大文件,定期清理日志文件、缓存等,保持磁盘空间充足。
  • 磁盘分区管理:合理规划磁盘分区,避免单一分区空间过小导致磁盘使用过载。
  • 磁盘 I/O 优化:对于 I/O 密集型任务,可以使用 SSD 替代 HDD,或将频繁读写的数据放在更快的磁盘上。
  • 文件系统优化:选择合适的文件系统(如 ext4、xfs)和挂载选项来提高磁盘 I/O 性能。