计算 Linux 内存使用率方法及C实现


通过获取Linux中的 /proc/stat 文件中的内容可以获取系统内存的详细信息:

# cat /proc/meminfo 
MemTotal:        3880404 kB
MemFree:         3182248 kB
MemAvailable:    3396580 kB
Buffers:           39588 kB
Cached:           355616 kB
SwapCached:            0 kB
Active:           318708 kB
Inactive:         252380 kB
Active(anon):     176120 kB
Inactive(anon):      248 kB
Active(file):     142588 kB
Inactive(file):   252132 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        175940 kB
Mapped:            54184 kB
Shmem:               488 kB
Slab:              62040 kB
SReclaimable:      48712 kB
SUnreclaim:        13328 kB
KernelStack:        2672 kB
PageTables:         6080 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1940200 kB
Committed_AS:     615340 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       14160 kB
VmallocChunk:   34359715580 kB
HardwareCorrupted:     0 kB
AnonHugePages:     36864 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       53120 kB
DirectMap2M:     3092480 kB
DirectMap1G:     3145728 kB

各字段含义见下表:

指标 作用
MemTotal 总内存大小
MemFree 空闲内存大小
buffers/cached 磁盘缓存的大小
MemAvailable 可用内存大小
SwapTotal 可用的swap空间的总的大小。
SwapFree 剩余swap空间的大小。
Dirty 需要写入磁盘的内存区大小。
Writeback 正在被写回磁盘的大小。
AnonPages 未映射页的内存大小。
Mapped 设备和文件等映射的大小。
Slab 内核数据结构slab的大小,可以减少申请和释放内存带来的消耗。

注Buffers 和 Cached的区别

Buffers 是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages. cached 是用来给文件做缓冲。

buffers 是值存储目录里面有什么内容,权限等等。 而cached直接用来记忆我们打开的文件,比如先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。 而buffers随时都在增加,比如先后两次使用ls /dev后,就会发现第二次执行的速度会较第一次快。 这就是buffers/chached的区别。

  • 以内核态来讲, buffers  和 cached  是已经被使用的,可用内存就是 MemAvailable

    MemUsed  = MemTotal - MemFree
  • 以用户态来讲,buffers  和 cached  可被分配。

    free = MemFree + Buffers + Cahched
  • 本着监控应用对物理内存使用情况的目的采集,计算方法:

    MemUsedPrec = 100*(MemTotal - MemFree - Buffers - Cahched)/MemTotal

黑洞

    经过一番计算,发现 /proc/meminfo 中的数据无论如何无法与 free 中的内容对应,尤其是在 used 部分。经过一番信息检索,得出一个结论, free 命令中的数值是按照 /proc/meminfo 中的数据,根据一定算法计算所得,并且新版旧版的 free 所输出内容也不一致。因此按照 proc/meminfo 中的数据计算内存使用率是更加精确的。
进一步探索,会发现 Linux 存在一个内存黑洞,在某博主博客找到如下描述:

追踪Linux系统的内存使用一直是个难题,很多人试着把能想到的各种内存消耗都加在一起,kernel text、kernel modules、buffer、cache、slab、page table、process RSS…等等,却总是与物理内存的大小对不上,这是为什么呢?因为Linux kernel并没有滴水不漏地统计所有的内存分配,kernel动态分配的内存中就有一部分没有计入/proc/meminfo中。 —— 《/PROC/MEMINFO之谜》

综上原因,计算Linux内存使用率也就没有必要去细扣每个数值的含义了,大致了解如下内容即可:

  • MemTotal:总内存大小
  • MemFree: 空闲内存大小
  • buffers/cached: 磁盘缓存的大小
  • MemAvailable: 可用内存大小

而计算内存使用率只需按照这个方法计算:

实际可挪用的内存数: free+cache+buffer,
实际可使用的内存数: used-cache-buffer (total-free-cache-buffer)。
内存占用率:(total-available) / total * 100 

C实现

同样的, 先定义一个结构体用于存放相关数据:

struct MEM_INFO
{
    unsigned int total;
    unsigned int free;
    unsigned int buffers;
    unsigned int cached;
    unsigned int swap_cached;
    unsigned int swap_total;
    unsigned int swap_free;
    unsigned int available;
};
typedef struct MEM_INFO Mem_info;

之后定义函数,用于获取及计算内存数据:

void  get_mem_occupy (Mem_info *o)
{
    FILE* fpMemInfo = fopen("/proc/meminfo", "r");
    if (NULL == fpMemInfo)
    {
        return ;
    }
    int i = 0;
    int value;
    char name[1024];
    char line[1024];
    int nFiledNumber = 2;
    int nMemberNumber = 5;
    while (fgets(line, sizeof(line) - 1, fpMemInfo))
    {
        if (sscanf(line, "%s%u", name, &value) != nFiledNumber)
        {
            continue;
        }
        if (0 == strcmp(name, "MemTotal:"))
        {
            ++i;
            o->total = value;
        }
        else if (0 == strcmp(name, "MemFree:"))
        {
            ++i;
            o->free = value;
        }
        else if (0 == strcmp(name, "MemAvailable:"))
        {
            ++i;
            o->available = value;
        }
        else if (0 == strcmp(name, "Buffers:"))
        {
            ++i;
            o->buffers = value;
        }
        else if (0 == strcmp(name, "Cached:"))
        {
            ++i;
            o->cached = value;
        }
        if (i == nMemberNumber)
        {
            break;
        }
    }
    // system("free");
    // system("cat /proc/meminfo");
    // printf("MemTotal      : %d\n",o->total);
    // printf("MemFree       : %d\n",o->free);
    // printf("MemAvailable  : %d\n",o->available);
    // printf("MemBuffers    : %d\n",o->buffers);
    // printf("MemCached     : %d\n",o->cached);
    // printf("MemSwapCached : %d\n",o->swap_cached);
    // printf("MemSwapTotal  : %d\n",o->swap_total);
    // printf("MemSwapFree   : %d\n",o->swap_free);
    fclose(fpMemInfo);
}

float cal_mem_occupy(Mem_info *o)
{
    return (100.0 * (o->total - o->available) / o->total);
}

最后调用即可:

    Mem_info omem;
    while(1)
    {
        // printf("-------------------- Mem occupy -------------------\n");
        get_mem_occupy(&omem);
        printf("Mem Usage(%): %8.4f\n", cal_mem_occupy(&omem));
        printf("\n");
    }

参考文献

计算 Linux CPU 利用率

在 Linux 系统中的 /proc/stat 文件中存储了CPU 活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。

$ cat /proc/stat 
cpu  1594121 406 1239990 396233700 162305 0 3641 0 0 0
cpu0 761327 194 604191 198151599 83873 0 1789 0 0 0
cpu1 832793 211 635798 198082101 78432 0 1852 0 0 0
intr 985115307 38 10 0 0 58 0 3 0 0 0 0 36 15 0 0 0 0 0 0 0 0 0 0 0 0 2473171 42 0 862348 0 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 1896726060
btime 1592793001
processes 63407
procs_running 1
procs_blocked 0
softirq 191297272 3 90057502 70 10686595 0 0 34 51485476 0 39067592

第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:

参数 解析(单位:jiffies) 当前值
name 设备名。 cpu
user 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。 1594121
nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。 406
system 从系统启动开始累计到当前时刻,处于核心态的运行时间。 1239990
idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间。 396233700
iowait 从系统启动开始累计到当前时刻,IO等待时间。 162305
irq 从系统启动开始累计到当前时刻,硬中断时间。 0
softirq 从系统启动开始累计到当前时刻,软中断时间。 3641
stealstolen 从系统启动开始累积到当前时刻,在虚拟环境运行时花费在其他操作系统的时间。 0
guest 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费的时间。 0
guest_nice 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费在nice进程上的时间。 0

注:jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在 linux 中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同 linux 内核可能值有不同,通常在 1ms 到 10ms 之间


totalCpuTime  = user  + nice + system + idle + iowait + irq + softirq + stealstolen + guest + guest_nice 
cpu使用率计算:

  1. 请在一段时间内(推荐:必须大于0s,小于等于1s),获取两次cpu时间分配信息。
  2. 计算两次的cpu总时间:total_2 – total_1
  3. 计算两次的cpu剩余时间:idle_2 – idle_1
  4. 计算两次的cpu使用时间:used = (total_2 – total_1) – (idle_2 – idle_1)
  5. cpu使用率 = 使用时间 / 总时间 100% = used / total 100%
    us: User time       -> %us = (User + Nice) / totalCpuTime * 100%
    sy: System time     -> %sy = (System + Hard Irq + SoftIRQ) / totalCpuTime
    ni: Nick time       -> %ni = (Nice) / totalCpuTime * 100%
    id: Idle time       -> %id = (Idle) / totalCpuTime * 100%
    wa: Waiting time    -> %wa = (Waiting) / totalCputTime * 100%
    hi: Hard Irq time   -> %hi = (Hard Irq) / totalCpuTime * 100%
    si: SoftIrq time    -> %si = (SoftRQ) / totalCpuTime * 100%
    st: Steal time      -> %st = (Steal) / totalCputTime * 100%

    程序实现(C)

    首先定义一个结构体存放获取到的信息:

    struct CPU_INFO
    {
     char name[10];
     unsigned int user;
     unsigned int nice;
     unsigned int system;
     unsigned int idle;
     unsigned int iowait;
     unsigned int irq;
     unsigned int softirq;
     unsigned int stealstolen;
     unsigned int guest;
     unsigned int guest_nice;
    };

    定义两个函数用于获取信息和计算:

    
    void  get_occupy (Cpu_info *o)
    {
     FILE *fd;
     char buff[MAXBUFSIZE];
     fd = fopen ("/proc/stat", "r"); //这里只读取stat文件的第一行及cpu总信息,如需获取每核cpu的使用情况,请分析stat文件的接下来几行。
     fgets (buff, sizeof(buff), fd);
     // printf("get thr cpu info: %s", buff);
     sscanf (buff, "%s  %u %u %u %u %u %u %u %u %u %u", o->name, &o->user, &o->nice, &o->system, &o->idle, &o->iowait, &o->irq, &o->softirq, &o->stealstolen, &o->guest, &o->guest_nice);
     // printf("name=%s, user=%d, nice=%d, system=%d, idle=%d, iowait=%d, irq=%d, softirq=%d, stralstolen=%d, guest=%d, guest_nice=%d\n", o->name, o->user, o->nice, o->system, o->idle, o->iowait, o->irq, o->softirq, o->stealstolen, o->guest, o->guest_nice);
     fclose(fd);
    }

float cal_occupy (Cpu_info o, Cpu_info n) { int ototal, ntotal; int oused, nused;

ototal = (o->user + o->nice + o->system + o->idle + o->iowait + o-> irq + o-> softirq + o->stealstolen + o->guest + o->guest_nice);
ntotal = (n->user + n->nice + n->system + n->idle + n->iowait + n-> irq + n-> softirq + n->stealstolen + n->guest + n->guest_nice);

oused = ototal - o->idle;
nused = ntotal - n->idle;

// printf("ototal time: %d\n", ototal);
// printf("ntotal time: %d\n", ntotal);

// printf("oused time: %d\n", oused);
// printf("nused time: %d\n", nused);

return (100.0 * (nused - oused) / (ntotal - ototal));

}

最后主程序调用即可:
```c
Cpu_info ocpu,ncpu;
    printf("Start the new thread to monitor key system values.\n");
    while(1)
    {
        //获取cpu使用率
        get_occupy(&ocpu);
        sleep(1);
        get_occupy(&ncpu);
        printf("CPU Usage(%): %8.4f\n", cal_occupy(&ocpu, &ncpu));
    }

参考文献

Linux 内存参数详细说明

在 Linux 下 free 命令可以看出系统当前内存状况,附上 -k , -m , -g 可以分别输出对应单位的内存状况:

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
     --peta          show output in petabytes

以某台 Linux Ecs 为例,运行 free -m 后的输出如下:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3789         229         621           0        2937        3261
Swap:             0           0           0

这些值都是什么意思呢?

首先看行:
Mem :表示物理内存统计
Swap :表示硬盘上交换分区的使用情况(这里我们不去关心)
注:系统的总物理内存:3789M,但系统当前真正可用的内存并不是第一行 free  标记的 621M,它仅代表未被分配的内存。

接下来看列:
total :总计物理内存的大小。
used :已使用多大。
free :可用有多少。
Shared :多个进程共享的内存总额。
Buffers/cached :磁盘缓存的大小。

这大致就是 Linux 下内存各项参数的含义,还有更复杂的参数,未来遇到新的场景时再做补充。

——————— 补充 ———————

cat /proc/meminfo 
MemTotal:        3880404 kB      //总内存
MemFree:          637548 kB      //空闲内存
MemAvailable:    3340664 kB
Buffers:          178760 kB      //给文件的缓冲大小
Cached:          2535436 kB      //高速缓冲存储器使用的大小
SwapCached:            0 kB      //被高速缓冲存储用的交换空间大小
Active:          1370440 kB      //活跃使用中的高速缓冲存储器页面文件大小
Inactive:        1506936 kB      //不经常使用的高速缓冲存储器页面文件大小
Active(anon):     163452 kB
Inactive(anon):      216 kB
Active(file):    1206988 kB
Inactive(file):  1506720 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB      //交换空间总大小
SwapFree:              0 kB      //空闲交换空间
Dirty:                76 kB      //等待被写回到磁盘的大小
Writeback:             0 kB      //正在被写回的大小
AnonPages:        163320 kB      //未映射的页的大小
Mapped:            65100 kB      //设备和文件映射的大小
Shmem:               492 kB      
Slab:             294180 kB      //内核数据结构缓存的大小,可减少申请和释放内存带来的消耗
SReclaimable:     278620 kB      //可收回slab的大小
SUnreclaim:        15560 kB      //不可收回的slab的大小15560 + 278620 = 294180
KernelStack:        2624 kB
PageTables:         5720 kB       //管理内存分页的索引表的大小
NFS_Unstable:          0 kB       //不稳定页表的大小
Bounce:                0 kB 
WritebackTmp:          0 kB
CommitLimit:     1940200 kB
Committed_AS:     586464 kB
VmallocTotal:   34359738367 kB    //虚拟内存大小
VmallocUsed:       14160 kB       //已经被使用的虚拟内存大小
VmallocChunk:   34359715580 kB
HardwareCorrupted:     0 kB
AnonHugePages:     10240 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0         //大页面的分配
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       98176 kB
DirectMap2M:     4096000 kB
DirectMap1G:     2097152 kB

参考文献

Linux 下 Sysstat 系统监控程序详解

Sysstat 包包含许多商业单位共有的各种实用程序,用于监控系统性能和使用活动:

  • iostat  (1) 报告设备、分区和网络文件系统的CPU统计和硬盘吞吐效率的数据。 # 核心工具
  • mpstat  (1) 报告单个或组合处理器相关的统计数据。
  • pidstat  (1) 报告Linux任务 (进程) 的统计信息: I/O、CPU、内存等。
  • tapestat  (1) 报告连接到系统的磁带驱动器的统计信息。
  • cifsiostat  (1) 报告CIFS统计。
  • sysstat  (5) 只是sysstat配置文件的手动页面,给出了sysstat命令使用的环境变量的含义。

Sysstat 还包含您可以通过 cron 或 systemd 计划收集和记录性能和活动数据的工具:

  • sar  (1) 收集、报告和保存系统活动信息 (CPU、内存、磁盘、中断、网络接口、TTY、内核表等)。 # 数据统计核心工具
  • sadc  (8) 是系统活动数据收集器,用作sar的后端。
  • sa1  (8) 在系统活动每日数据文件中收集并存储二进制数据。它是sadc的前端,设计为从cron或systemd运行。
  • sa2  (8) 撰写每日活动总结报告。它是从cron或systemd运行的sar的前端。
  • sadf  (1) 以多种格式 (CSV、XML、JSON等) 显示由sar收集的数据,并可用于与其他程序的数据交换。该命令还可用于为sar使用SVG (可伸缩矢量图形) 格式收集的各种活动绘制图形。

    1 性能及运行状况监控

    1.1 isstat

    使用方法: `iostat [ options ] [

    [ ] ]`  “`bash $ iostat –help Usage: iostat [ options ] [ [ ] ] Options are: [ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ { -f | +f } ] [ -j { ID | LABEL | PATH | UUID | … } ] [ –dec={ 0 | 1 | 2 } ] [ –human ] [ -o JSON ] [ [ -H ] -g ] [ -p [ [,…] | ALL ] ] [ […] | ALL ] “` 参数释义:
    `-c`  : 仅显示cpu的状态
    `-d`  : 仅显示存储设备的状态,不可以和-c一起使用
    `-k`  : 默认显示的是读入读出的block信息,用-k可以改成KB大小来显示 -m
    `-t`  : 显示日期
    `-p device | ALL`  : device为某个设备或者某个分区,如果使用ALL,就表示要显示所有分区和设备的信息
    `-x`  : 显示扩展状态,显示更多内容
    举例:每一秒钟打印一次CPU状态,打印3次 “`bash $ iostat -c 1 3 Linux 3.10.0-957.21.3.el7.x86_64 (frytea-dev-test) 07/14/2020 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle 0.40 0.00 0.31 0.00 0.00 99.29

avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.50 0.00 0.00 99.50

avg-cpu: %user %nice %system %iowait %steal %idle 0.50 0.00 0.00 0.00 0.00 99.50

距离:显示详细信息
```bash
iostat -x
Linux 3.10.0-957.21.3.el7.x86_64 (frytea-dev-test)      07/14/2020      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.40    0.00    0.31    0.00    0.00   99.29

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
vda              0.01      0.14     0.00   0.06    1.19    16.99    0.65      5.88     0.21  24.79    7.65     9.02    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.01

说明:
rrqm/s : 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s : 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s : 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s : 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s : 每秒读扇区数。即 delta(rsect)/s
wsec/s : 每秒写扇区数。即 delta(wsect)/s
rkB/s : 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkB/s : 每秒写K字节数。是 wsect/s 的一半。(需要计算)
avgrq-sz : 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz : 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await : 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm : 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util : 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
delta(use)/s/1000  (因为use的单位为毫秒)如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
idle 小于70% IO压力就较大了,一般读取速度有较多的wait.  #CPU空闲等待时间

1.2 mpstat

使用方法:mpstat [ options ] [

[ ] ] “`bash $ mpstat –help Usage: mpstat [ options ] [ [ ] ] Options are: [ -A ] [ -n ] [ -u ] [ -V ] [ -I { SUM | CPU | SCPU | ALL } ] [ -N { | ALL } ] [ –dec={ 0 | 1 | 2 } ] [ -o JSON ] [ -P { | ALL } ] “` 举例:查看所有处理器统计数据 “`bash $ mpstat -P ALL 1 3 Linux 3.10.0-957.21.3.el7.x86_64 (frytea-dev-test) 07/14/2020 _x86_64_ (2 CPU) 11:35:24 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:35:25 AM all 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.00 11:35:25 AM 0 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 11:35:25 AM 1 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 11:35:25 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:35:26 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 11:35:26 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 11:35:26 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 11:35:26 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:35:27 AM all 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 99.01 11:35:27 AM 0 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 99.01 11:35:27 AM 1 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 99.01 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 0.17 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.33 Average: 0 0.33 0.00 0.33 0.00 0.00 0.00 0.00 0.00 0.00 99.33 Average: 1 0.00 0.00 0.67 0.00 0.00 0.00 0.00 0.00 0.00 99.33 “` 说明: – `%user`     显示在用户级别(application)运行使用 CPU 总时间的百分比。 – `%nice`     显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。 – `%system`  在核心级别(kernel)运行所使用 CPU 总时间的百分比。 – `%iowait`  显示用于等待I/O操作占用 CPU 总时间的百分比。 – `%irq`   显示在interval时间段内,硬中断占用的CPU总时间。 – `%soft`   显示在interval时间段内,软中断占用的CPU总时间。 – `%steal`   管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比。 – `%idle`     显示 CPU 空闲时间占用CPU总时间的百分比。 – `intr/s`  在internal时间段里,每秒CPU接收的中断的次数。 ### 1.3 pidstat “`bash pidstat -dl Linux 3.10.0-957.21.3.el7.x86_64 (frytea-dev-test) 07/14/2020 _x86_64_ (2 CPU) 12:01:54 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 12:01:54 PM 0 1 0.11 0.58 0.05 /usr/lib/systemd/systemd –switched-root –system –deserialize 22 12:01:54 PM 0 48 0.00 0.00 0.00 kworker/u4:1 12:01:54 PM 0 226 0.00 0.00 0.00 kworker/u4:2 12:01:54 PM 0 328 0.00 0.85 0.00 jbd2/vda1-8 12:01:54 PM 0 397 0.00 1.95 0.00 /usr/lib/systemd/systemd-journald 12:01:54 PM 0 416 0.01 0.00 0.00 /usr/lib/systemd/systemd-udevd 12:01:54 PM 0 496 0.00 0.01 0.00 /sbin/auditd 12:01:54 PM 0 594 0.00 0.00 0.00 /usr/lib/systemd/systemd-logind 12:01:54 PM 999 598 0.00 0.00 0.00 /usr/lib/polkit-1/polkitd –no-debug 12:01:54 PM 81 599 0.00 0.00 0.00 /usr/bin/dbus-daemon –system –address=systemd: –nofork –nopidfile –systemd-activation 12:01:54 PM 998 616 0.00 0.00 0.00 /usr/sbin/chronyd 12:01:54 PM 0 659 0.00 0.00 0.00 /usr/sbin/atd -f 12:01:54 PM 0 673 0.00 0.00 0.00 /sbin/agetty –keep-baud 115200,38400,9600 ttyS0 vt220 12:01:54 PM 0 895 0.00 0.00 0.00 /usr/bin/python2 -Es /usr/sbin/tuned -l -P 12:01:54 PM 0 898 0.00 0.04 0.00 /usr/sbin/rsyslogd -n 12:01:54 PM 0 1110 0.01 1.80 0.02 /usr/sbin/sshd -D 12:01:54 PM 0 13001 0.00 0.00 0.00 /usr/local/aegis/AliSecGuard/AliSecGuard 12:01:54 PM 0 13646 0.00 0.01 0.00 /usr/sbin/crond -n 12:01:54 PM 0 17624 0.00 0.02 0.00 /usr/local/aegis/aegis_update/AliYunDunUpdate 12:01:54 PM 0 17651 0.00 0.00 0.00 /usr/local/aegis/aegis_client/aegis_10_83/AliYunDun 12:01:54 PM 0 23766 0.00 0.00 0.00 /usr/sbin/aliyun-service 12:01:54 PM 0 23924 0.00 0.02 0.00 -bash “` ### 1.4 tapestat Tapestat报告提供连接到系统的每个磁带驱动器的统计信息。
使用方法: `tapestat [ options ] [ [ ] ]`  “`bash $ tapestat –help Usage: tapestat [ options ] [ [ ] ] Options are: [ –human ] [ -k | -m ] [ -t ] [ -V ] [ -y ] [ -z ] [root@frytea-dev-test ~]# tapestat -k “` ### 1.5 cifsiostat CIFS报告提供每个装载的CIFS文件系统的统计信息。
使用方法: `cifsiostat [ options ] [ [ ] ]`  “`bash $ cifsiostat –HELO Usage: cifsiostat [ options ] [ [ ] ] Options are: [ –dec={ 0 | 1 | 2 } ] [ –human ] [ -h ] [ -k | -m ] [ -t ] [ -V ] “` ## 2 数据收集及统计 ### 2.1 sar sar 工具比较强大,既能收集系统CPU、硬盘、动态数据,也能显示动态显示,更能查看二进制数据文件;sar 的应用比较多,而且也比较复杂,数据更为精确。我们只了解一下常用的内容就行,大多数内容我们了解就行。 “`bash sar –help Usage: sar [ options ] [ [ ] ] Main options and reports (report name between square brackets): -B Paging statistics [A_PAGE] -b I/O and transfer rate statistics [A_IO] -d Block devices statistics [A_DISK] -F [ MOUNT ] Filesystems statistics [A_FS] -H Hugepages utilization statistics [A_HUGE] -I { | SUM | ALL } Interrupts statistics [A_IRQ] -m { [,…] | ALL } Power management statistics [A_PWR_…] Keywords are: CPU CPU instantaneous clock frequency FAN Fans speed FREQ CPU average clock frequency IN Voltage inputs TEMP Devices temperature USB USB devices plugged into the system -n { [,…] | ALL } Network statistics [A_NET_…] Keywords are: DEV Network interfaces EDEV Network interfaces (errors) NFS NFS client NFSD NFS server SOCK Sockets (v4) IP IP traffic (v4) EIP IP traffic (v4) (errors) ICMP ICMP traffic (v4) EICMP ICMP traffic (v4) (errors) TCP TCP traffic (v4) ETCP TCP traffic (v4) (errors) UDP UDP traffic (v4) SOCK6 Sockets (v6) IP6 IP traffic (v6) EIP6 IP traffic (v6) (errors) ICMP6 ICMP traffic (v6) EICMP6 ICMP traffic (v6) (errors) UDP6 UDP traffic (v6) FC Fibre channel HBAs SOFT Software-based network processing -q [ [,…] | PSI | ALL ] System load and pressure-stall statistics Keywords are: LOAD Queue length and load average statistics [A_QUEUE] CPU Pressure-stall CPU statistics [A_PSI_CPU] IO Pressure-stall I/O statistics [A_PSI_IO] MEM Pressure-stall memory statistics [A_PSI_MEM] -r [ ALL ] Memory utilization statistics [A_MEMORY] -S Swap space utilization statistics [A_MEMORY] -u [ ALL ] CPU utilization statistics [A_CPU] -v Kernel tables statistics [A_KTABLES] -W Swapping statistics [A_SWAP] -w Task creation and system switching statistics [A_PCSW] -y TTY devices statistics [A_SERIAL] “` 参数说明:
`-A`  显示所有历史数据,通过读取/var/log/sar目录下的所有文件,并把它们分门别类的显示出来;
`-b`  通过设备的I/O中断读取设置的吞吐率;
`-B`  报告内存或虚拟内存交换统计;
`-c`  报告每秒创建的进程数;
`-d`  报告物理块设备(存储设备)的写入、读取之类的信息,如果直观一点,可以和p参数共同使用,-dp
`-f`  从一个二进制的数据文件中读取内容,比如 sar -f filename
`-i`  interval 指定数据收集的时间,时间单位是秒;
`-n`  分析网络设备状态的统计,后面可以接的参数有 DEV、EDEV、NFS、NFSD、SOCK等。比如-n DEV
`-o`  把统计信息写入一个文件,比如 -o filename ;
`-P`  报告每个处理器应用统计,用于多处理器机器,并且启用SMP内核才有效;
`-p`  显示友好设备名字,以方便查看,也可以和-d和-n 参数结合使用,比如 -dp 或-np
`-r`  内存和交换区占用统计;
`-R` 
`-t`  这个选项对从文件读取数据有用,如果没有这个参数,会以本地时间为标准 读出;
`-u`  报告CPU利用率的参数;
`-v`  报告inode,文件或其它内核表的资源占用信息;
`-w`  报告系统交换活动的信息; 每少交换数据的个数;
`-W`  报告系统交换活动吞吐信息;
`-x`  用于监视进程的,在其后要指定进程的PID值;
`-X`  用于监视进程的,但指定的应该是一个子进程ID
举例:查看网络设备的网络吞吐量 “`bash # sar -n DEV 2 4 Linux 3.10.0-957.21.3.el7.x86_64 (frytea-dev-test) 07/14/2020 _x86_64_ (2 CPU) 12:00:50 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:00:52 PM eth0 2.50 2.50 0.14 1.28 0.00 0.00 0.00 0.00 12:00:52 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:00:52 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:00:54 PM eth0 1.50 1.00 0.09 0.33 0.00 0.00 0.00 0.00 12:00:54 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:00:54 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:00:56 PM eth0 2.00 1.50 0.12 0.36 0.00 0.00 0.00 0.00 12:00:56 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:00:56 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:00:58 PM eth0 1.00 1.00 0.07 0.33 0.00 0.00 0.00 0.00 12:00:58 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil Average: eth0 1.75 1.50 0.11 0.58 0.00 0.00 0.00 0.00 Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 “` 参数释义:
IFACE:设备名;
rxpck/s:每秒收到的包;
rxbyt/s:每秒收到的所有包的数量 ;
txbyt/s:每秒发送的所有包的数量 ;
txbyt/s:每秒发送的所有包的大小;
rxcmp/s:每秒收到数的据压缩包的数量;
txcmp/s :每秒传输的数据压缩包的数据;
rxmcst/s: 每秒收到的多播的包数量; ### 2.2 sadc `sadc`  位于 `/usr/local/lib64/sa/` 目录中(Centos 7.6),如果你没有设置可执行路径,要用绝对路径来运行。
sdac只是一个搜集写入工具,并不直接回显于屏幕上。sadc 是把数据写在一个二进制的文件中,如果想查看数据内容,需要用sadf工具来显示。
使用方法: `/usr/local/lib64/sa/sadc [ options ] [ [ ] ] [ ]`  “`bash $ /usr/local/lib64/sa/sadc –help Usage: /usr/local/lib64/sa/sadc [ options ] [ [ ] ] [ ] Options are: [ -C ] [ -D ] [ -F ] [ -f ] [ -L ] [ -V ] [ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ] “` 举例: `/usr/local/lib/sa/sadc -`  (后面的“-”是必须的,少了会出乱码和报错),则会输出数据到 `/var/log/sa/` 目录下的一个文件中。 ### 2.3 sa1 Sa1 命令被设计为由cron命令自动启动。 ### 2.4 sa2 Sa2 命令接受sar命令的大多数标志和参数。
Sa2 命令被设计为由cron命令自动启动。 ### 2.5 sadf sadf 能从二进制文件中提取sar所收集的数据;显示的格式不如sar直观,其主要用于导出为csv、xml等格式的文件,方便导入数据库或excel等程序. ## 参考文献 – [Systat Document](http://sebastien.godard.pagesperso-orange.fr/) – [Linux下sysstat安装使用图文详解](https://www.linuxidc.com/Linux/2019-08/160082.htm)

安装 Linux系统监控工具 systat

Sysstat是一种在Linux系统服务器中常用的软件工具包,可以用来监控服务器的性能。比如可以监控CPU、硬盘、网络等数据,我们可以用来进行分析服务器的性能和资源的使用效率。

在 Linux 公社中已有多篇文章介绍该工具的使用方法:


今天就来介绍一下这款好用的 Linux 系统监控工具如何安装:

方法一:源码安装

sysstat 是一款开源的自由软件,其源代码开源在 GitHub ,您可以首先拉取仓库源码:

git clone https://github.com/sysstat/sysstat.git

之后运行如下命令:

$ ./configure
$ make
$ su
<enter root password>
# make install

安装成功!

方法二:软件包管理器直接安装

Install from RHEL/Fedora/CentOS

$ sudo yum install sysstat

CentOS和Fedora系统使用/etc/cron.d中的cron作业来调用收集器进程,并且默认情况下已启用它。 在最新版本中,使用systemd代替cron。 您可能需要启用并启动sysstat服务:

$ sudo systemctl enable sysstat
$ sudo systemctl start sysstat

Install from Ubuntu

$ sudo apt-get install sysstat

然后启用数据收集:

$ sudo vi /etc/default/sysstat
change ENABLED="false" to ENABLED="true"
save the file

最后,重新启动sysstat服务:

$ sudo service sysstat restart


安装完成后,就可以利用这款强大的工具去监控我们的 Linux 操作系统了:
至于其使用,将会在后面的文章中介绍。

我的博客即将同步至腾讯云 + 社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=21yjpwt8mhhc0

Linux 中 /proc 文件系统内容详述

Linux 下的 /proc 文件系统中提供了许多有用的信息,除了基本的CPU使用率、版本号等,你甚至还可以在这里直接看到内核的输出。下面这张表,简单列举 /proc 中文件的含义:

文件名 含义
num 这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。
acpi ACPI(高级配置和电源接口)支持操作系统设置和控制各个硬件部件。 ACPI 可以取代 PnP 和 APM。 它提供有关电池、AC 适
配器、温度、风扇和系统事件(例如 “合上机盖” 或 “电池电量低”)的信息。
buddyinfo 用于诊断内存碎片问题的相关信息文件;
bus
cgroups cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
cmdline 在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;
consoles
cpuinfo 处理器的相关信息的文件;
crypto 系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
devices 系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;
diskstats 每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)
dma 每个正在使用且注册的ISA DMA通道的信息列表;
driver 内核当前支持的执行域(每种操作系统独特“个性”)信息列表;
execdomains Linux内核当前支持的execution domains
fb 帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;
filesystems 当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;
fs
interrupts X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;
iomem 每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;
ioports 当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;
irq 为每个注册的irq创建一个以irq编号为名字的子目录
kallsyms 内核符号表(kernel symbol table)作用,变量名或者函数名组成,每一项是符号和地址的序对,就像域名和ip地址
kcore 系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件;
keys 如果一个进程希望了解它可以查看哪些密钥,它可以通过读取 /proc/keys 获得这些信息。在配置内核时,必须启用这个文件,因为它允许任何用户列出密钥数据库。 
key-users
kmsg 此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件;
kpagecount
kpageflags
loadavg 保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID;
locks 保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问;
mdstat 保存RAID相关的多块磁盘的当前状态信息;
meminfo 系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;
misc
modules 当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;
mounts -> self/mounts 在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;
mtrr
net -> self/net
pagetypeinfo
partitions 块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目;
sched_debug
schedstat
scsi
self -> 22742
slabinfo 在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页;
softirqs
stat 实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,
“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);
“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目;
swaps 当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息;
sys 与 /proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性,事先可以使用“ls -l”命令查看某文件是否“可写入”。写入操作通常使用类似于“echo  DATA > /path/to/your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。
/proc/sys/debug 子目录
此目录通常是一空目录;
/proc/sys/dev 子目录
为系统上特殊设备提供参数信息文件的目录,其不同设备的信息文件分别存储于不同的子目录中,如大多数系统上都会具有的/proc/sys/dev /cdrom和/proc/sys/dev/raid(如果内核编译时开启了支持raid的功能) 目录,其内存储的通常是系统上cdrom和raid的相关参数信息文件。
sysrq-trigger
sysvipc
timer_list
timer_stats
tty
uptime 系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;
version 当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本,如下所示;
vmallocinfo
vmstat 当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件)
zoneinfo 内存区域(zone)的详细信息列表,信息量较大

参考文献

我的博客即将同步至腾讯云 + 社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=21yjpwt8mhhc0

拯救你的硬盘,一切井井有条

由于一直研究计算机相关技术,从开始的500GB硬盘,带后来1TB的移动硬盘,再到后来4TB移动硬盘,再到后来移动NAS。

随着数据量的不断增长,一昧的扩容硬盘也许不是一个最佳的选择,如果文件只是简单堆放,就真的同一堆数据垃圾没有两样。经过一天的整理、探索、构思,结合以往数据整理的方法,重新设计了一种个人文件数据库的存储方案,从存储介质到存储结构做了重新整合,同时考虑了个体在群体中活动可能需要产生联系的文档方案。下面就来介绍一下,其实数据,不一定非要存在硬盘里!硬盘容量,不是越大越好!

云存储介质

百度云盘的评价一直不是很好,限速、降容。看到的是百度网盘难用的现状,但其实看不到的是在国内这个网络大环境之下,带宽资源还是太过珍贵,与之相比存储资源真的不算什么,其实最花钱的是带宽资源。以某云计算提供商的弹性服务器为例,月付1M带宽升级到2M带宽需要加价近100RMB,升级到10M就直接快突破千元大关。

如此看来,数据云存储是不是还是一个遥不可及的梦呢?

不是的,除了百度云,其实你还有许多种选择方案。

  • 坚果云
  • 天翼云盘
  • WPS云
  • OneDrive
  • Google Drive

一个一个来说。首先是坚果云。坚果云的主打就是不限速,而且速度极快!具有版本控制,同步文件很放心。结合以上所说的大环境,提供了较快的带宽,就必须要限制其流量,因此坚果云通过约束每月上传下载流量来约束带宽。普通用户每月免费上传3GB,下载1GB,简单的文档同步真的是绰绰有余了,关键是用的放心,比起百度云的限速和天翼云的软件不稳定,坚果云用作多设备之间的文件同步真的很舒服了。据说清华、中科院这样的机构都在用它。

下面说说天翼云,天翼云由中国电信运营,也许是其强大的实力,天翼云提供的容量不小,关键是不限速,(最近加入了上传限速),用起来真的非常爽了,自己很早之前就注册了天翼账号,电信默认为我开通了天翼云盘,最近上去一看居然空间已经到了10TB+,为了抢占客户资源,中国电信真的是大手笔了。但可惜的是,体验一个月以来,其同步功能并不是那么令人放心,特别是一些重要文档,修改后貌似需要时间才会自动同步,不会像坚果云那样,修改一个字符都会同步。因此天翼云目前来看更适合存放一些电影、游戏等体积较大的文件资源,可以用作大文件云备份。

WPS云是WPS默认提供的, 其和WPS无缝对接,做云文档的体验真的太棒了,缺点是免费用户单文件10MB,但是基本上也是够用了,做临时文档存储和协作真的是很不错。

OneDrive不必多说,基本每个Windows电脑上都会被预装这个软件,拥有一个微软账号就能用了,受制于其物理位置,微软提供的OneDrive服务在国内体验并不好,由世纪互联运营的OneDrive体验还不错,每月至少花费30RMB就能在国内体验到1TB空间的不限速的上传下载数据,基本能够跑满带宽。但就我个人来看,OneDrive这个平台开发的并不好,web端太复杂,兼容性不好,一些旧的浏览器直接打不开,其次其稳定性还是有待考量,虽然有国内世纪互联代理版,基本上速度可以得到保障,但是其API就不够标准,拓展性弱了许多,其次其速度在有些时候得不到保障,不像坚果云那样稳定,也不像GoogleDrive那样稳定。但总的来看,其在大多数场景下的表现还是不错的。

GoogleDrive在国内很小众,想在国内使用你不能是麻瓜。但这真的是一款让你用了就离不开的东西。花几十块钱弄一个无限容量的盘,不放心可以多买几个互相备份。除了这些,其使用体验真的是很棒了,只要你的魔法差不多够强,GD可以提供几乎完美的体验,无限空间+不限速,同步灵敏度极高,稍有修改立刻同步,真的很令人放心,加上其几乎无敌的拓展性,可以轻易的分享给会魔法的同伴,还可以很轻易地建一个自己的资源站,几乎是无敌了。国内要是能出现这样一款产品,也是无敌的存在了,但是受制于许多因素,国内暂时不会出现这样的产品。具有和坚果云一样的稳定性和速度,但是不限制上下行流量,具有比天翼云还大的容量,但是非常稳定可靠。想在国内做出这样一款产品,首先必须是巨头,高层热衷于技术,其次国内网络环境必须优化到一个新的层级,综上两点,也许可以打造这样一款优秀的产品。

存储方案

上面花费许多篇幅讲述了云存储介质,云存储介质的好处在于云备份、按需存取、无缝迁移。也可以自己弄一个移动硬盘来做重要文件的备份。下面讲讲存储方案,这套方案考虑了本地端+云端,设计了一套存储结构,只需云端和本地端直接对应,互相增量同步,或是按需存储即可。

https://imagehost-cdn.frytea.com/20200705084003.jpg

上图体现了存储介质之间的存储层级、存储层级之间的关系以及个人文档库和团队文档库的对接方法,下面一一描述。

首先是云端和本地端数据互备份,可以根据需要在两端之间互相增量备份,也可以设定几个特定的文件夹进行互备份,总之按照两边都可以按照这个层级来设计目录结构,之后向目录结构中存放自己的文件即可。

各个文件夹中的内容大概按照下表:

Name Tags
Data 数据
Tools 工具,包括软件、操作系统等
Study 学习资料,包括图书、笔记
TimeLine 具有日期的事物相关材料
TeamInfo 团队材料,负责某团队活动产生的资料
Design 设计资源,字体、模板等
Media 多媒体资源,影音娱乐
Memory 记忆,包括照片、影响、文档
PersonInfo 个人资料,个人隐私材料
Security 密钥、机密
Archieve 归档,一些无关紧要但又有些价值的文件包。

各个文件夹中内容又有一些联系,根据图来看,数据分为一手资源、二手资源,一手资源是待整理的资源,需要整理后变为二手资源,使其结构化,方便未来取用及分享。

而作为个人和团队,将团队资源对接至个人文件夹中的团队信息文件夹,之后走个人文件流程即可。而团队的活动资源可分为活动前、活动中、活动后及归档。

总结

相信每个人都有自己的一套文档管理方法,随着时间的推进。人们的信息会逐渐“上云”,信息也不可避免地电子化,在这浩如烟海的数据海洋中,唯有“变废为宝”者才有可能享受到数据的价值。

这是我的个人文档管理方法,你的呢?

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=21yjpwt8mhhc0

VIM学习使用笔记

如果是初学vi,运行一下 vimtutor是个聪明的决定。 (如果你的系统环境不是中文,而你想使用中文的vimtutor,就运行 vimtutor zh)

学习笔记

Vim第一讲 基础操作

Vim第二讲 删除、重复、撤销

Vim第三讲 置入、替换、更改

Vim第四讲 搜索、查找、替换

Vim第五讲 内部命令、另存、部分保存、插入文件

Vim第六讲 插入、附加、复制粘贴、高级选项

Vim第七讲 帮助、个性化和补全

参考文献

Vim第七讲 帮助、个性化和补全

7.1 获取帮助信息

** 使用在线帮助系统 **

Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方 法之一:

  • 按下 ` ` 键 (如果键盘上有的话)
  • 按下 ` ` 键 (如果键盘上有的话)
  • 输入 :help

请阅读帮助窗口中的文字以了解帮助是如何工作的。 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。 输入 :q <回车> 可以关闭帮助窗口。

提供一个正确的参数给” :help “命令,您可以找到关于该主题的帮助。请试验以 下参数(可别忘了按回车键哦):

    :help w
    :help c_CTRL-D
    :help insert-index
    :help user-manual

7.2 创建启动脚本

** 启用 Vim 的特性 **

Vim 的功能特性要比 Vi 多得多,但其中大部分都没有缺省启用。为了使用更多的 特性,您得创建一个 vimrc 文件。

  1. 开始编辑 vimrc 文件,具体命令取决于您所使用的操作系统: :edit ~/.vimrc 这是 Unix 系统所使用的命令 :edit $VIM/_vimrc 这是 MS-Windows 系统所使用的命令
  2. 接着读取 vimrc 示例文件的内容: :r $VIMRUNTIME/vimrc_example.vim
  3. 保存文件,命令为: :write

下次您启动 Vim 时,编辑器就会有了语法高亮的功能。 您可以把您喜欢的各种设置添加到这个 vimrc 文件中。 要了解更多信息请输入 :help vimrc-intro

7.3 补全功能

** 使用 CTRL-D 和 
<TAB> 可以进行命令行补全 **
  1. 请确保 Vim 不是在以兼容模式运行: :set nocp
  2. 查看一下当前目录下已经存在哪些文件,输入: :!ls 或者 :!dir
  3. 现在输入一个目录的起始部分,例如输入: :e
  4. 接着按 CTRL-D 键,Vim 会显示以 e 开始的命令的列表。
  5. 然后按 ` ` 键,Vim 会补全命令为 `:edit` 。
  6. 现在添加一个空格,以及一个已有文件的文件名的起始部分,例如: :edit FIL
  7. 接着按 ` ` 键,Vim 会补全文件名(如果它是惟一匹配的)。

提示:补全对于许多命令都有效。您只需尝试按 CTRL-D 和 `

`。 它对于 `:help` 命令非常有用。 ## 总结 1. 输入 `:help` 或者按 ` ` 键或 “ 键可以打开帮助窗口。 2. 输入 `:help cmd` 可以找到关于 cmd 命令的帮助。 3. 输入 `CTRL-W` CTRL-W 可以使您在窗口之间跳转。 4. 输入 `:q` 以关闭帮助窗口 5. 您可以创建一个 `vimrc` 启动脚本文件用来保存您偏好的设置。 6. 当输入 `:` 命令时,按 `CTRL-D` 可以查看可能的补全结果。 按 ` ` 可以使用一个补全。 ## 推荐阅读 Vim – Vi Improved – 作者:Steve Oualline 出版社:New Riders 这是第一本完全讲解 Vim 的书籍。它对于初学者特别有用。其中包含有大量实例 和图示。 欲知详情,请访问 [http://iccf-holland.org/click5.html](http://iccf-holland.org/click5.html)

Vim第六讲 插入、附加、复制粘贴、高级选项

6.1 打开类命令

** 输入 o 将在光标的下方打开新的一行并进入插入模式。**
  1. 输入小写的 o 在光标 下方 打开新的一行,这个命令会使您 进入插入模式。
  2. 然后输入一些文字,按 ` ` 键退出插入模式而进入正常模式。
  3. 为了在光标 上方 打开新的一行,只需要输入大写的 O 而不是小写的 o 就可以了。

6.2 附加类命令

** 输入 a 将可在光标之后插入文本。 **
  1. 接着输入 e 移动光标至需添加单词的末尾。
  2. 输入小写的 a 则可在光标之后插入文本了。
  3. 按 ` ` 键退出插入模式回到正常模式。

提示: a、 i 和 A 都会带您进入插入模式,惟一的区别在于字符插入的位置。

6.3 另外一个置换类命令的版本

** 输入大写的 R 可连续替换多个字符。**
  1. 输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入。
  2. 接着按 ` ` 键退出替换模式回到正常模式。

6.4 复制粘贴文本

** 使用操作符 y 复制文本,使用 p 粘贴文本 **
  1. 使用 v 进入可视模式,移动光标到欲复制单词前面。
  2. 输入 y 以抽出(复制)高亮的文本。
  3. 输入 p 以放置(粘贴)复制了的文本。

提示:您还可以把 y 当作操作符来使用;例如 yw 可以用来复制一个单词。

6.5 设置类命令的选项

** 设置可使查找或者替换可忽略大小写的选项 **
  1. 要查找单词 ignore 可在正常模式下输入 /ignore <回车>。 要重复查找该词,可以重复按 n 键。
  2. 然后设置 ic 选项(Ignore Case,忽略大小写),请输入: :set ic
  3. 现在可以通过键入 n 键再次查找单词 ignore。注意到 Ignore 和 IGNORE 现在 也被找到了。
  4. 然后设置 hlsearch 和 incsearch 这两个选项,请输入: :set hls is
  5. 现在可以再次输入查找命令,看看会有什么效果: /ignore <回车>
  6. 要禁用忽略大小写,请输入: :set noic

提示:要移除匹配项的高亮显示,请输入: :nohlsearch 提示:如果您想要仅在一次查找时忽略字母大小写,您可以使用 \c: /ignore\c <回车>

总结

  1. 输入小写的 o 可以在光标下方打开新的一行并进入插入模式。 输入大写的 O 可以在光标上方打开新的一行。
  2. 输入小写的 a 可以在光标所在位置之后插入文本。 输入大写的 A 可以在光标所在行的行末之后插入文本。
  3. e 命令可以使光标移动到单词末尾。
  4. 操作符 y 复制文本, p 粘贴先前复制的文本。
  5. 输入大写的 R 将进入替换模式,直至按 ` ` 键回到正常模式。
  6. 输入 :set xxx 可以设置 xxx 选项。一些有用的选项如下: 'ic' ‘ignorecase’ 查找时忽略字母大小写 'is' ‘incsearch’ 查找短语时显示部分匹配 'hls' ‘hlsearch’ 高亮显示所有的匹配短语 选项名可以用完整版本,也可以用缩略版本。
  7. 在选项前加上 no 可以关闭选项: :set noic