linux的SWAP分区

linuxSWAP分区

from net 汇总网络信息,并进行测试验证,感谢网络。

Linux SWAP 深度解读 https://blog.csdn.net/wh8_2011/article/details/51798407

swap分析及其使用 https://www.cnblogs.com/arnoldlu/p/6291251.html

Linux 下的dd命令使用详解以及dd if=/dev/zero of=的含义 https://blog.csdn.net/md_555/article/details/9428491

 

Swap简介

Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。

希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题:

1、 swap到底是干嘛的?

2、 swappiness到底是用来调节什么的?

3、 kswapd什么时候会进行swap操作?

4、 什么是内存水位标记?

5、 swap分区的优先级(priority)有啥用?

linux交换分区即是linux的SWAP分区

     SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用. 它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。

    需要注意的是,虽然这个SWAP分区能够作为"虚拟"的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于SWAP,最好的办法仍然是加大物理内存.SWAP分区只是临时的解决办法.

   交换分区(swap)的合理值一般在内存的2 倍左右,可以适当加大。实际上具体还是以实际应用为准,swap为内存的2倍也不过是一种以讹传讹的说法。如果交换分区的使用都超过4GB以上了,可想而知服务器的性能应该差很多了。

    Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。

Swap系统总结

回收内存原因:为了系统稳定,应对大内存申请和空闲内容不足,定期回收内存(文件映射&匿名file_backend&swap),主要是file&anon

内存水位标识:如何调整,基于swapiness,0--100 swaps活跃度

回收内存算法:anon:file   (swapiness):(200-swapiness)

 

-----详细信息:-----------------------

回收内存原因:(file&anon

     swap主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。一种是anon的匿名页内存,主要回收手段是swap;另一种是file-backed的文件映射页,主要释放手段是写回和清空。

     内核有必要设计一个周期行回收内存机制,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

内存水位标记(watermark)

Linux为内存的使用设置了三种内存水位标记:highlowmin
high:剩余的内存在high以上表示内存剩余较多,目前内存使用压力不大。
high-low:表示剩余内存存在一定压力。
low-min:表示内存开始使用有较大压力,剩余内存不多了。
min:是最小水位标记,当剩余内存达到这个状态时,就说明内存面临很大压力。小于min这部分内存,内核是保留给特定情况下使用的,一般不分配。

初始化min_free_kbytes  low水位线位于min1.25倍地方  high水位线位于min1.5倍地方

内存回收行为就是基于剩余内存的水位标记进行的:

当系统内存低于watermark[low]的时候,内核的kswapd开始起作用,进行内存回收。直到剩余内存达到watermark[high]的时候停止。

如果内存消耗导致达到了或者低于watermark[min]时,就会触发直接回收(direct reclaim)

zonefile+zonefree<=high_wmark_pages(zone):触发kswapd进程

如果触发的是全局回收,并且zonefile+zonefree<=high_wmark_pages(zone)条件成立时,就将scan_banlance这个标记置为SCAN_ANON。后续处理scan_balance的时候,则一定会进行针对匿名页的swap操作。
   再来看看zonefile+zonefree<=high_wmark_pages(zone)这个公式就能理解了。zonefile是内存中文件映射的总量,zonefree相当于剩余内存总量。内核一般认为,如果zonefile还有的话,就尽量通过清空文件缓存获得部分内存,而不必只使用swap方式对anon内存进行交换。

这样是为了防止进入cache陷阱。这个判断对系统的影响是,swappiness0时,有剩余内存的情况下也可能发生交换。

内存回收原理:

      内存被谁使用,Swap空间是“匿名”数据的交换空间

      内存主要被进程,打开的文件,mallocnew函数生成的对象等使用。 并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。

     例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。

    但是那些用mallocnew函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。

    内存回收操作主要针对的就是内存中的文件页(file  cache)和匿名页。

        一种是anon的匿名页内存,主要回收手段是swap

       另一种是file-backed的文件映射页,主要的释放手段是写回和清空。

       因为针对filebased的内存,没必要进行交换,其数据原本就在硬盘上,回收这部分内存只要在有脏数据时写回,并清空内存就可以了,以后有需要再从对应的文件读回来。

       如果是file的文件映射page页,则判断其是否为脏数据,如果是脏数据就写回,不是脏数据可以直接释放。

 内核在应对这两类回收的需求下,分别实现两种不同的机制:

     一个是使用kswapd进程对内存进行周期检查,以保证平常状态下剩余内存尽可能够用。
另一个是页面回收(page reclaim),就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。

      这两种内存回收的触发路径不同:

      kswapd作为一个后台守护进程,会定期检查内存的使用情况,并检测即将发生的内存不足。可使用该守护进程换出页,并释放那些最不常用的。

    内存回收主要需要进行少秒的链表有如下4个:

    anoninactiveanonactivefileinactivefileactive

    就是说内存回收主要针对的就是内存中的文件页(file cache)和匿名页。

   关于活跃还是不活跃的判断内核会使用lru算法进行并行处理并进行标记。

 

Swap命令操作

swap配置:最大16G

物理内存小于16G时,采用物理内存*2,但是不大于16G

物理内存大于16G时,采用16G

可以用swapon , top,free命令查看。

 

Swap参数调整

1swap配置:最大16G

物理内存小于16G时,采用物理内存*2,但是不大于16G

物理内存大于16G时,采用16G

可以用top,free命令查看。

free -m|grep ^Swap

 

swap分为swap分区或者swap文件,一般采用swap文件。查看方法

   lvs检查是否使用LVM卷

   swapon -s

 

参数配置:

  使用swap进行内存交换的积极性参数,表示内存使用率到达100-vm.swappiness后,出现swap交换分区的使用

     (1)在/etc/sysctl.conf里设置
        vm.swappiness = 5
     (2)sysctl -p

     查看:

       sysctl -n vm.swappiness命令

     

配置项

说明

配置原则

基线值

属性

配置方法

检查方法

手工操作内容

是否重启生效

手工操作内容

Swap

SWAP交换分区,根据物理内存配置而定,不宜过小,避免出现因交换空间不足而导致系统崩溃的情况。

把交换空间的大小根据实际物理内存进行配置,从而使交换空间更好的被利用。

(1)物理内存<=8G,交换空间=2*物理内存
(2)8G<物理内存<16G,交换空间=物理内存
(3)16G=<物理内存,交换空间为应用系统对物理内存的需求的一倍或以上

 

参见安装手册,安装系统前进行分区并创建文件系统

(1)free | grep -i ^Swap检查容量
(2)lvdisplay检查是否使用LVM卷

 

vm.swappiness

使用swap进行内存交换的积极性参数,表示内存使用率到达100-vm.swappiness后,出现swap交换分区的使用。

系统缺省值60,根据实践经验以及novell公司策略建议,调整该值为5

5

 

(1)在/etc/sysctl.conf里设置
vm.swappiness = 5
(2)sysctl -p

sysctl -n vm.swappiness命令

 

 

 

默认: cat /proc/sys/vm/swappiness

       sysctl -a|grep vm.swap

4、swap水位查看

 sysctl

  /proc/sys/vm/min_free_kbytes

   /proc/zoneinfo文件中查看当前系统的相关的信息和使用情况

   使用swap进行内存交换的积极性参数,表示内存使用率到达100-vm.swappiness后,出现swap交换分区的使用

 

 (1)在/etc/sysctl.conf里设置
        vm.swappiness = 5
 (2)重新加载

    sysctl -p

 (3)查看:

      sysctl -n vm.swappiness

      sysctl |grep swap

     

 

Swap空间的操作:

---swap检查

swapon -s              # 查看所有交换分区

--swap扩容

  1. yast2新建在rootvg下新建一个分区命名为swap2类型选择swap

   lvcreate -L 2G -n lvswap2 tmpvg

   mkswap /dev/tmpvg/lvswap2

 

2、永久生效在文件/etc/fstab添加一行

   /dev/tmpvg/lvswap2 swap                 swap       defaults              0 0

3swap生效:swapon -av

4、检查:free -m

 

---swap卸载是倒过来。

  1. 检查

   lvs|grep swap

  

  1. 卸载

   swapoff -v /dev/tmpvg/lvswap2

3、在文件/etc/fstab删除一行 或者注释

   /dev/tmpvg/lvswap2 swap                 swap       defaults              0 0

  1. 检查

   swapon -s

   free -m

  1. 删除lv lvswap2

   lvs|grep swap

   lvchange -an dev/tmpvg/lvswap2

   lvremove /dev/tmpvg/lvswap2

From NET 详细资料:

Swapon-s也能简单地查看当前Swap资源的使用情况。例如:

# swapon -s

Filename Type Size Used Priority

/dev/hda9 partition 361420 0 3

能够方便地看出Swap空间的已用和未用资源的大小。

应该使Swap负载保持在30%以下,这样才能保证系统的良好性能。

1 查看系统swap space大小:

linux-jian:~ # free -m

total used free shared buffers cached
Mem: 377 180 197 0 19 110
-/+ buffers/cache: 50 327
Swap: 572 0 572

 

2 查看当前的swap空间(file(s)/partition(s))

linux-jian:~ # swapon -s
等价于
linux-jian:~ # cat /proc/swaps

 

swaponshow

NAME      TYPE      SIZE USED PRIO

/dev/dm-1 partition   8G   0B   -1

 

3 添加交换空间

两种选择:添加一个交换分区或添加一个交换文件。推荐你添加一个交换分区;不过,若你没有多少空闲空间可用,则添加交换文件。

3.1 添加一个交换分区
步骤如下:
a 使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区)
b 使用 mkswap 命令来设置交换分区:
mkswap /dev/sdb2
c 启用交换分区:
swapon /dev/sdb2
d 写入/etc/fstab,以便在引导时启用:
/dev/sdb2 swap swap defaults 0 0

 

3.2 添加一个交换文件
a 创建大小为512M的交换文件:
dd if=/dev/zero of=/swapfile1 bs=1024 count=524288

块大小(bsbs=bytes:同时设置读入/输出的块大小为bytes个字节。

1KB=1024byte=1024*8bit

修改为这样更好理解:dd if=/dev/zero of=/swapfile1 bs=1M count=512

b 使用 mkswap 命令来设置交换文件:
mkswap /swapfile1

c 启用交换分区:
swapon /swapfile1 

根据提示调整文件权限 chmod +600 /swapfile1

此时检查:

suse12-appm-python01:/ # swapon -s

文件名              类型        大小    已用    权限

/swapfile1                             file        524284  0   -2

/dev/dm-1                                  partition   8380412 0   -1

 

d 写入/etc/fstab,以便在引导时启用:
/swapfile1 swap swap defaults 0 0

新添了交换分区并启用它之后,请查看 cat /proc/swaps 或 free 命令的输出来确保交换分区已被启用了。

4 删除交换空间:
a 禁用交换分区:
swapoff /dev/sdb2
b 从 /etc/fstab 中删除项目;
c 使用fdisk或yast工具删除分区。

 

删除交换文件步骤同上

a、swapoff /swapfile1

b /etc/fstab 中删除项目;

crm 文件系统

 

Swap技术原理

内存交换技术

    swap主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。当内存使用存在压力的时候,开始触发内存回收行为,就可能会使用swap空间。

     内核将很少使用的部分内存换出到块设备,相当于提供了更多的主内存,这种机制成为页交换(swapping)或者换页(paging),由内核实现,对应用程序是透明的。

     内存回收这个行为会对两种内存的使用进行回收:

一种是anon的匿名页内存,主要回收手段是swap;另一种是file-backed的文件映射页,主要释放手段是写回和清空。

Swap类型:Swap空间是“匿名”数据的交换空间

    Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。

 

Swap空间是“匿名”数据的交换空间

    Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

   需要说明一点,并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。

      例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。

     但是那些用mallocnew函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。

 

为什么要进行内存回收?

1.内核需要为突发到来的内存申请提供足够的内存,所以一般情况下保证有足够的free空间对于内核来说是必要的。
  另外,Linux内核使用cache策略虽然是不用白不用,内核会使用内存中的page cache对部分文件进行缓存,一边提升文件的读写效率。
  所以内核有必要设计一个周期行回收内存机制,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

2.当真的有大于空闲内存的申请到来时,会触发强制内存回收。

所以内核在应对这两类回收的需求下,分别实现两种不同的机制:

一个是使用kswapd进程对内存进行周期检查,以保证平常状态下剩余内存尽可能够用。
另一个是页面回收(page reclaim),就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。

这两种内存回收的触发路径不同:

kswapd作为一个后台守护进程,会定期检查内存的使用情况,并检测即将发生的内存不足。可使用该守护进程换出页,并释放那些最不常用的。

内存回收主要需要进行少秒的链表有如下4个:

anoninactiveanonactivefileinactivefileactive

就是说内存回收主要针对的就是内存中的文件页(file cache)和匿名页。

关于活跃还是不活跃的判断内核会使用lru算法进行并行处理并进行标记。

kswapd进程要周期对内存进行检测,达到一定阈值的时候开始进行内存回收。这个所谓的阈值可以理解为内存目前的使用压力。虽然我们还有剩余内存,但是当剩余内存比较小的时候,就是内存压力较大的时候,就应该开始试图回收写内存了,这样才能保证系统尽可能有足够的内存给突发的内存申请所使用。

如果触发的是全局回收,并且zonefile+zonefree<=high_wmark_pages(zone)条件成立时,就将scan_banlance这个标记置为SCAN_ANON。后续处理scan_balance的时候,则一定会进行针对匿名页的swap操作。
再来看看zonefile+zonefree<=high_wmark_pages(zone)这个公式就能理解了。zonefile是内存中文件映射的总量,zonefree相当于剩余内存总量。内核一般认为,如果zonefile还有的话,就尽量通过清空文件缓存获得部分内存,而不必只使用swap方式对anon内存进行交换。
这样是为了防止进入cache陷阱。这个判断对系统的影响是,swappiness0时,有剩余内存的情况下也可能发生交换。

 

kswapd什么时候进行swap操作?

内核的两种内存回收机制kswapd周期检查和直接内存回收,直接内存回收比较好理解,当申请的内存大于剩余内存的时候,就会触发直接回收。

kswapd进程在周期检查的时候触发回收的条件是什么呢?

   kswapd进程要周期对内存进行检测,达到一定阈值的时候开始进行内存回收。这个所谓的阈值可以理解为内存目前的使用压力。虽然我们还有剩余内存,但是当剩余内存比较小的时候,就是内存压力较大的时候,就应该开始试图回收写内存了,这样才能保证系统尽可能有足够的内存给突发的内存申请所使用。

基于swappiness调优

详情请参考:http://blog.csdn.net/tenfyguo/article/details/50185915

swappiness是一个swap相关百分比参数,默认值是60,范围是0-100

This control is used to define how aggressive the kernel will swap memory pages.  Higher values will increase agressiveness, lower values decrease the amount of swap.  A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

从上面这段话可知,swappiness表示内核swap内存页的积极程度。值越高越是积极的进行swap;降低表示积极性越低。swappiness值为0是,不是不进行swap,只是一个zone中内存的freefile-backed页低于高水位标记才会进行swap

1.如果swappiness设置为100,那么匿名页和文件将用同样的优先级进行回收。
   很明显,使用清空文件的的方式将有利于减轻内存回收时可能造成的IO压力。因为如果file-backed中的数据不是脏数据的话,那么可以不用写回,这样就没有IO发生,而一旦进行交换,就一定会造成IO。所以系统默认将swappiness的值设置为60,这样回收内存时,对file-backed的文件cache的清空比例会更大,内核更倾向于进行缓存清空而不是交换。

2.如果swappiness值是60,内核回收的时候也不是完全按照60:140比例清空。在计算具体回收大小的时候,还需要参考当前内存使用的其他信息。
   我们在此需要明确的概念是:swappiness的值是用来控制内存回收时,回收的匿名页更多一些还是祸首的file-backed更多一些。

3.swappiness0的话,也不是根本不进行swap
   内存真的不够用时,还是会进行swap。比如为global_reclaim的时候,还是会导致在处理scan_balance的时候进行SCAN_ANON

   如果触发的是全局回收,并且zonefile+zonefree<=high_wmark_pages(zone)条件成立时,就将scan_banlance这个标记置为SCAN_ANON。后续处理scan_balance的时候,则一定会进行针对匿名页的swap操作。
再来看看zonefile+zonefree<=high_wmark_pages(zone)这个公式就能理解了。zonefile是内存中文件映射的总量,zonefree相当于剩余内存总量。内核一般认为,如果zonefile还有的话,就尽量通过清空文件缓存获得部分内存,而不必只使用swap方式对anon内存进行交换。
这样是为了防止进入cache陷阱。这个判断对系统的影响是,swappiness0时,有剩余内存的情况下也可能发生交换。

如何查看当前系统的内存水位标记?

A: cat /proc/zoneinfo

 

内存水位标记(watermark)

Linux为内存的使用设置了三种内存水位标记:highlowmin
high:剩余的内存在high以上表示内存剩余较多,目前内存使用压力不大。
high-low:表示剩余内存存在一定压力。
low-min:表示内存开始使用有较大压力,剩余内存不多了。
min:是最小水位标记,当剩余内存达到这个状态时,就说明内存面临很大压力。小于min这部分内存,内核是保留给特定情况下使用的,一般不分配。

初始化min_free_kbytes  low水位线位于min1.25倍地方  high水位线位于min1.5倍地方

 

 

内存回收行为就是基于剩余内存的水位标记进行的:

当系统内存低于watermark[low]的时候,内核的kswapd开始起作用,进行内存回收。直到剩余内存达到watermark[high]的时候停止。

如果内存消耗导致达到了或者低于watermark[min]时,就会触发直接回收(direct reclaim)

 

 

所有的内存watermark标记都是根据当前内存总大小和一个可调参数进行运算得来的,这个参数是: /proc/sys/vm/min_free_kbytes

首先这个参数本身决定了系统中每个zone的watermark[min]的值大小。

然后内核根据min的大小并参考每个zone的内存大小分别算出每个zone的low水位和high水位值。

想了解具体逻辑可以参见源代码目录下的该文件:

mm/page_alloc.c

在系统中可以从/proc/zoneinfo文件中查看当前系统的相关的信息和使用情况。

我们会发现以上内存管理的相关逻辑都是以zone为单位的,这里zone的含义是指内存的分区管理。

 

在系统中可以从/proc/zoneinfo文件中查看当前系统的相关的信息和使用情况。

我们会发现以上内存管理的相关逻辑都是以zone为单位的,这里zone的含义是指内存的分区管理。

Linux将内存分成多个区,主要有:

直接访问区(DMA)

一般区(Normal)

高端内存区(HighMemory)

内核对内存不同区域的访问因为硬件结构因素会有寻址和效率上的差别。如果在NUMA架构上,不同CPU所管理的内存也是不同的zone。

swap分区的优先级

在使用多个swap分区或者文件的时候,还有一个优先级的概念。

swapon的时候,可以使用-p指定相关swap空间的优先级,值越大优先级越高,范围是-132767

内核在使用swap空间的时候总是先使用优先级搞得空间,后使用优先级低的。

如果把多个swap空间的优先级设置成一样的,那么swap空间将会以轮询的方式并行使用。

如果两个swap放在不同硬盘上,相同优先级可以起到类似的RAID效果,增大swap的读写效率。

编程时使用mlock()可以将指定的内存标记为不换出。

 

Q&A

一个内存剩余还比较大的系统中,是否有可能使用swap?

A: 有可能,如果运行中的某个阶段出发了这个条件”zonefile+zonefree<=high_wmark_pages(zone) “,就可能会swap。

 

    如果触发的是全局回收,并且zonefile+zonefree<=high_wmark_pages(zone)条件成立时,就将scan_banlance这个标记置为SCAN_ANON。后续处理scan_balance的时候,则一定会进行针对匿名页的swap操作。
再来看看zonefile+zonefree<=high_wmark_pages(zone)这个公式就能理解了。zonefile是内存中文件映射的总量,zonefree相当于剩余内存总量。内核一般认为,如果zonefile还有的话,就尽量通过清空文件缓存获得部分内存,而不必只使用swap方式对anon内存进行交换。
这样是为了防止进入cache陷阱。这个判断对系统的影响是,swappiness0时,有剩余内存的情况下也可能发生交换。

 

swappiness设置为0就相当于关闭swap么?

A: 不是的,关闭swap要使用swapoff命令。swappiness只是在内存发生回收操作的时候用来平衡cache回收和swap交换的一个参数,调整为0意味着,尽量通过清缓存来回收内存。

 

A: swappiness设置为100代表系统会尽量少用剩余内存而多使用swap么?

不是的,这个值设置为100表示内存发生回收时,从cache回收内存和swap交换的优先级一样。就是说,如果目前需求100M内存,那么较大机率会从cache中清除50M内存,再将匿名页换出50M,把回收到的内存给应用程序使用。但是这还要看cache中是否能有空间,以及swap是否可以交换50m。内核只是试图对它们平衡一些而已。

 

kswapd进程什么时候开始内存回收?

A: kswapd根据内存水位标记决定是否开始回收内存,如果标记达到low就开始回收,回收到剩余内存达到high标记为止。

 

如何查看当前系统的内存水位标记?

A: cat /proc/zoneinfo

 

 

 

 

 

补充技术:Dd技术

一、dd命令的解释

 

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512c=1k=1024w=2

参数注释:

1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >

2. of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >

3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

    bs=bytes:同时设置读入/输出的块大小为bytes个字节。

4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。

7. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

8. conv=conversion:用指定的参数转换文件。

    ascii:转换ebcdicascii

     ebcdic:转换asciiebcdic

    ibm:转换asciialternate ebcdic

    block:把每一行转换为长度为cbs,不足部分用空格填充

    unblock:使每一行的长度都为cbs,不足部分用空格填充

    lcase:把大写字符转换为小写字符

    ucase:把小写字符转换为大写字符

    swab:交换输入的每对字节

     noerror:出错时不停止

     notrunc:不截短输出文件

    sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

二、dd应用实例

1.将本地的/dev/hdb整盘备份到/dev/hdd

#dd if=/dev/hdb of=/dev/hdd

2./dev/hdb全盘数据备份到指定路径的image文件

#dd if=/dev/hdb of=/root/image

3.将备份文件恢复到指定盘

#dd if=/root/image of=/dev/hdb

4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径

#dd if=/dev/hdb | gzip > /root/image.gz

5.将压缩的备份文件恢复到指定盘

#gzip -dc /root/image.gz | dd of=/dev/hdb

6.备份与恢复MBR

备份磁盘开始的512个字节大小的MBR信息到指定文件:

#dd if=/dev/hda of=/root/image count=1 bs=512

   count=1指仅拷贝一个块;bs=512指块大小为512个字节。

恢复:

#dd if=/root/image of=/dev/had

将备份的MBR信息写到磁盘开始部分

7.备份软盘

#dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)

8.拷贝内存内容到硬盘

#dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)  

9.拷贝光盘内容到指定文件夹,并保存为cd.iso文件

#dd if=/dev/cdrom(hdc) of=/root/cd.iso

10.增加swap分区文件大小

第一步:创建一个大小为256M的文件:

#dd if=/dev/zero of=/swapfile bs=1024 count=262144

第二步:把这个文件变成swap文件:

#mkswap /swapfile

第三步:启用这个swap文件:

#swapon /swapfile

第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:

/swapfile    swap    swap    default   0 0

11.销毁磁盘数据

#dd if=/dev/urandom of=/dev/hda1

注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

12.测试硬盘的读写速度

#dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

#dd if=/root/1Gb.file bs=64k | dd of=/dev/null

通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。

13.确定硬盘的最佳块大小:

#dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

#dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

#dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

#dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。

14.修复硬盘:

#dd if=/dev/sda of=/dev/sda dd if=/dev/hda of=/dev/hda

当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。

15.利用netcat远程备份

#dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234

在源主机上执行此命令备份/dev/hda

#netcat -l -p 1234 | dd of=/dev/hdc bs=16065b

在目的主机上执行此命令来接收数据并写入/dev/hdc

#netcat -l -p 1234 | bzip2 > partition.img

#netcat -l -p 1234 | gzip > partition.img

以上两条指令是目的主机指令的变化分别采用bzip2gzip对数据进行压缩,并将备份文件保存在当前目录。

将一个很大的视频文件中的第i个字节的值改成0×41(也就是大写字母AASCII值)

echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc

三、/dev/null/dev/zero的区别

/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!

/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0它提供从它读取的尽可能多的空字符(ASCII NUL0x00)。

/dev/null——它是空设备,也称为位桶(bit bucket。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

#if=/dev/zero of=./test.txt bs=1k count=1

#ls –l

total 4

-rw-r–r–    1 oracle   dba          1024 Jul 15 16:56 test.txt

#find / -name access_log  2>/dev/null

3.1使用/dev/null 

/dev/null看作"黑洞" 它等价于一个只写文件,所有写入它的内容都会永远丢失.,而尝试从它那儿读取内容则什么也读不到。然而, /dev/null对命令行和脚本都非常的有用

禁止标准输出

#cat $filename >/dev/null

文件内容丢失,而不会输出到标准输出.

禁止标准错误

#rm $badname 2>/dev/null

这样错误信息[标准错误]就被丢到太平洋去了

禁止标准输出和标准错误的输出

#cat $filename 2>/dev/null >/dev/null

如果"$filename"不存在,将不会有任何错误信息提示;如果"$filename"存在, 文件的内容不会打印到标准输出。

因此,上面的代码根本不会输出任何信息。当只想测试命令的退出码而不想有任何输出时非常有用。

#cat $filename &>/dev/null

这样其实也可以, Baris Cicek 指出

自动清空日志文件的内容

l Deleting contents of a file, but preserving the file itself, with all attendant permissions(from Example 2-1 and Example 2-3): 

#cat /dev/null > /var/log/messages

#  : > /var/log/messages   有同样的效果, 但不会产生新的进程.(因为:是内建的)

#cat /dev/null > /var/log/wtmp

隐藏cookie而不再使用

特别适合处理这些由商业Web站点发送的讨厌的"cookies"

#if [ -f ~/.netscape/cookies ]  # 如果存在则删除.

#then

#rm -f ~/.netscape/cookies

#fi

#ln -s /dev/null ~/.netscape/cookies

现在所有的cookies都会丢入黑洞而不会保存在磁盘上了.

3.2使用/dev/zero

/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到。 /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。

/dev/zero创建一个交换临时文件

#!/bin/bash

 # 创建一个交换文件.

 ROOT_UID=0 # Root 用户的 $UID 0.

 E_WRONG_USER=65 # 不是 root?

 FILE=/swap

 BLOCKSIZE=1024

 MINBLOCKS=40

 SUCCESS=0

 # 这个脚本必须用root来运行.

 if [ "$UID" -ne "$ROOT_UID" ]

   then

   echo; echo "You must be root to run this script."; echo

   exit $E_WRONG_USER

 fi

 blocks=${1:-$MINBLOCKS} # 如果命令行没有指定,

 #+ 则设置为默认的40.

 # 上面这句等同如:

 # ————————————————–

 # if [ -n "$1" ]

 # then

 # blocks=$1

 # else

 # blocks=$MINBLOCKS

 # fi

 # ————————————————–

 if [ "$blocks" -lt $MINBLOCKS ]

 then

 blocks=$MINBLOCKS # 最少要有 40 个块长.

 fi

 echo "Creating swap file of size $blocks blocks (KB)."

 dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.

 mkswap $FILE $blocks # 将此文件建为交换文件(或称交换分区).

 swapon $FILE # 激活交换文件.

 echo "Swap file created and activated."

 exit $SUCCESS 

关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件, 如挂载一个文件系统到环回设备 loopback device)或"安全地" 删除一个文件

例子创建ramdisk

#!/bin/bash

 # ramdisk.sh

 # "ramdisk"是系统RAM内存的一段,

 #+ 它可以被当成是一个文件系统来操作.

 # 它的优点是存取速度非常快 (包括读和写).

 # 缺点: 易失性, 当计算机重启或关机时会丢失数据.

 #+ 会减少系统可用的RAM.

 # 10 # 那么ramdisk有什么作用呢?

 # 保存一个较大的数据集在ramdisk, 比如一张表或字典,

 #+ 这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.

 E_NON_ROOT_USER=70 # 必须用root来运行.

 ROOTUSER_NAME=root

 MOUNTPT=/mnt/ramdisk

 SIZE=2000 # 2K 个块 (可以合适的做修改)

 BLOCKSIZE=1024 # 每块有1K (1024 byte) 的大小

 DEVICE=/dev/ram0 # 第一个 ram 设备

 username=`id -nu`

 if [ "$username" != "$ROOTUSER_NAME" ]

 then

    echo "Must be root to run "`basename $0`"."

    exit $E_NON_ROOT_USER

 fi

   if [ ! -d "$MOUNTPT" ] # 测试挂载点是否已经存在了,

 then #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了

    mkdir $MOUNTPT #+ 因为前面已经建立了.

 fi

 dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE

   # RAM设备的内容用零填充.                                               

   # 为何需要这么做?

 mke2fs $DEVICE # RAM设备上创建一个ext2文件系统.

 mount $DEVICE $MOUNTPT # 挂载设备.

 chmod 777 $MOUNTPT # 使普通用户也可以存取这个ramdisk.

 # 但是, 只能由root来缷载它.

 echo ""$MOUNTPT" now available for use."

 # 现在 ramdisk 即使普通用户也可以用来存取文件了.

 # 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.

 # 拷贝所有你想保存文件到一个常规的磁盘目录下.

 # 重启之后, 运行这个脚本再次建立起一个 ramdisk.

 # 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.

 # 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,

 #+ 以使系统启动时能自动设立一个ramdisk.

 # 这样很合适速度要求高的数据库服务器.

 exit 0

————————————————

版权声明:本文为CSDN博主「思君黯然」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/demo_deng/article/details/9428491

 

 

补充技术:sysctl技术

 

sysctl

Usage:

 sysctl [options] [variable[=value] ...]

 

Options:

  -a, --all            display all variables

  -A                   alias of -a

  -X                   alias of -a

      --deprecated     include deprecated parameters to listing

  -b, --binary         print value without new line

  -e, --ignore         ignore unknown variables errors

  -N, --names          print variable names without values

  -n, --values         print only values of a variables

  -p, --load[=<file>]  read values from file

  -f                   alias of -p

      --system         read values from all system directories

  -r, --pattern <expression>

                       select setting that match expression

  -q, --quiet          do not echo variable set

  -w, --write          enable writing a value to variable

  -o                   does nothing

  -x                   does nothing

  -d                   alias of -h

 

 -h, --help     display this help and exit

 -V, --version  output version information and exit

For more details see sysctl(8).

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值