• linux 之虚拟内存swap


      在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。


    缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。
    CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。

    Swap用途:Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。


    swap清理:swapoff -a && swapon -a
    注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大

    1. 新建和增加SWAP分区(都必须用root权限,操作过程应该小心谨慎。)

      1)新建分区

    1.以root身份进入控制台(登录系统),输入
    swapoff -a #停止所有的swap分区
    
    2. 用fdisk命令(例:# fdisk /dev/sdb)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。
    
    3.  mkswap /dev/sdb2 #格式化swap分区,这里的sdb2要看您加完后p命令显示的实际分区设备名
    
    4. # swapon /dev/sdb2 #启动新的swap分区
    
    5. 为了让系统启动时能自动启用这个交换分区,可以编辑/etc/fstab,加入下面一行
    /dev/sdb2 swap swap defaults 0 0

      2)新增分区

    1.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
    # dd if=/dev/zero of=/root/swapfile bs=1M count=1024
    
    2.格式化为交换分区文件:
    # mkswap /root/swapfile #建立swap的文件系统
    
    3.启用交换分区文件:
    # swapon /root/swapfile #启用swap文件
    
    4.使系统开机时自启用,在文件/etc/fstab中添加一行:
    /root/swapfile swap swap defaults 0 0

    2.调整swap空间使用的优先级

      如果内存够大,应当告诉 linux 不必太多的使用 SWAP 分区, 可以通过修改 swappiness 的数值。

      swappiness=0 的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

      各个操作系统的优先级可能都不一样,如果不调整,你会发现添加的虚拟内存几乎没有用到

      

    查看当前swappiness值
    
      # cat /proc/sys/vm/swappiness
    
      修改swappiness值为60(临时修改,重启后即还原为默认值)
    
      # sudo sysctl vm.swappiness=60
    
     
    
      永久修改swappiness默认值(重启生效)
    
      # vim /etc/sysctl.conf
    
      找到vm.swappiness ,如果没有则需要手动添加一行 vm.swappiness = 60 保存即可

    3. 四种方法在 Linux 系统中查找最大的前 10 个文件

      

    # find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 10
      
    1.4G /swapfile
    1.1G /home/magi/ubuntu-17.04-desktop-amd64.iso
    564M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqTFU0XzkzUlJUZzA
    378M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqeldzUmhPeC03Zm8
    377M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqRGd4V0VrOXM4YVU
    100M /usr/lib/x86_64-linux-gnu/libOxideQtCore.so.0
    93M /usr/lib/firefox/libxul.so
    84M /var/lib/snapd/snaps/core_3604.snap
    84M /var/lib/snapd/snaps/core_3440.snap
    84M /var/lib/snapd/snaps/core_3247.snap

    详解:

      • find:在目录结构中搜索文件的命令
      • /:在整个系统(从根目录开始)中查找
      • -type:指定文件类型
        f:普通文件
      • -print0:在标准输出显示完整的文件名,其后跟一个空字符(null)
      • |:控制操作符,将一条命令的输出传递给下一个命令以供进一步处理
      • xargs:将标准输入转换成命令行参数的命令
      • -0:以空字符(null)而不是空白字符(LCTT 译者注:即空格、制表符和换行)来分割记录
      • du -h:以可读格式计算磁盘空间使用情况的命令
      • sort:对文本文件进行排序的命令
      • -r:反转结果
      • -h:用可读格式打印输出
      • head:输出文件开头部分的命令
      • n -10:打印前 10 个文件

      2)

    # find / -type f -exec du -Sh {} + | sort -rh | head -n 10
      
    1.4G /swapfile
    1.1G /home/magi/ubuntu-17.04-desktop-amd64.iso
    564M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqTFU0XzkzUlJUZzA
    378M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqeldzUmhPeC03Zm8
    377M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqRGd4V0VrOXM4YVU
    100M /usr/lib/x86_64-linux-gnu/libOxideQtCore.so.0
    93M /usr/lib/firefox/libxul.so
    84M /var/lib/snapd/snaps/core_3604.snap
    84M /var/lib/snapd/snaps/core_3440.snap
    84M /var/lib/snapd/snaps/core_3247.snap

    详解:

      • find:在目录结构中搜索文件的命令
      • /:在整个系统(从根目录开始)中查找
      • -type:指定文件类型
        f:普通文件
      • -exec:在所选文件上运行指定命令
      • du:计算文件占用的磁盘空间的命令
      • -S:不包含子目录的大小
      • -h:以可读格式打印
      • {}:递归地查找目录,统计每个文件占用的磁盘空间
      • |:控制操作符,将一条命令的输出传递给下一个命令以供进一步处理
      • sort:对文本文件进行按行排序的命令
      • -r:反转结果
      • -h:用可读格式打印输出
      • head:输出文件开头部分的命令
      • n -10:打印前 10 个文件

      3)

    # find / -type f -print0 | xargs -0 du | sort -n | tail -10 | cut -f2 | xargs -I{} du -sh {}
      
    84M /var/lib/snapd/snaps/core_3247.snap
    84M /var/lib/snapd/snaps/core_3440.snap
    84M /var/lib/snapd/snaps/core_3604.snap
    93M /usr/lib/firefox/libxul.so
    100M /usr/lib/x86_64-linux-gnu/libOxideQtCore.so.0
    377M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqRGd4V0VrOXM4YVU
    378M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqeldzUmhPeC03Zm8
    564M /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqTFU0XzkzUlJUZzA
    1.1G /home/magi/ubuntu-17.04-desktop-amd64.iso
    1.4G /swapfile

    详解:

      • find:在目录结构中搜索文件的命令
      • /:在整个系统(从根目录开始)中查找
      • -type:指定文件类型
        f:普通文件
      • -print0:输出完整的文件名,其后跟一个空字符(null)
      • |:控制操作符,将一条命令的输出传递给下一个命令以供进一步处理
      • xargs:将标准输入转换成命令行参数的命令
      • -0:以空字符(null)而不是空白字符来分割记录
      • du:计算文件占用的磁盘空间的命令
      • sort:对文本文件进行按行排序的命令
      • -n:根据数字大小进行比较
      • tail -10:输出文件结尾部分的命令(最后 10 个文件)
      • cut:从每行删除特定部分的命令
      • -f2:只选择特定字段值
      • -I{}:将初始参数中出现的每个替换字符串都替换为从标准输入读取的名称
      • -s:仅显示每个参数的总和
      • -h:用可读格式打印输出
      • {}:递归地查找目录,统计每个文件占用的磁盘空间

      4)

    # find / -type f -ls | sort -k 7 -r -n | head -10 | column -t | awk '{print $7,$11}'
      
    1494845440 /swapfile
    1085984380 /home/magi/ubuntu-17.04-desktop-amd64.iso
    591003648 /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqTFU0XzkzUlJUZzA
    395770383 /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqeldzUmhPeC03Zm8
    394891761 /home/magi/.gdfuse/magi/cache/0B5nso_FPaZFqRGd4V0VrOXM4YVU
    103999072 /usr/lib/x86_64-linux-gnu/libOxideQtCore.so.0
    97356256 /usr/lib/firefox/libxul.so
    87896064 /var/lib/snapd/snaps/core_3604.snap
    87793664 /var/lib/snapd/snaps/core_3440.snap
    87089152 /var/lib/snapd/snaps/core_3247.snap

    详解:

      • find:在目录结构中搜索文件的命令
      • /:在整个系统(从根目录开始)中查找
      • -type:指定文件类型
        f:普通文件
      • -ls:在标准输出中以 ls -dils 的格式列出当前文件
      • |:控制操作符,将一条命令的输出传递给下一个命令以供进一步处理
      • sort:对文本文件进行按行排序的命令
      • -k:按指定列进行排序
      • -r:反转结果
      • -n:根据数字大小进行比较
      • head:输出文件开头部分的命令
      • -10:打印前 10 个文件
      • column:将其输入格式化为多列的命令
      • -t:确定输入包含的列数并创建一个表
      • awk:模式扫描和处理语言
      • '{print $7,$11}':只打印指定的列
  • 相关阅读:
    BreakRoleInheritance在多线程情况下调用的问题
    如何通过IAlertNotifyHandler来自定义Alert Email
    SPField的几种name的释疑
    使用SQL语句得到存储过程的实现
    在C# 中使用反射调用internal的属性
    程序安装时检查是否已经安装.NETFramework
    biztalk
    什么是Biztalk?
    分页存储过程
    SQL SERVER 2005 CLR 部署UDT,Triggers,Functions,Procedure,Aggregates
  • 原文地址:https://www.cnblogs.com/xingxia/p/memory_fdisk.html
Copyright © 2020-2023  润新知