imicman的个人空间 https://blog.eetop.cn/1518355 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

linux vitula memory limint exceded

已有 770 次阅读| 2016-4-20 21:25 |个人分类:验证杂谈

linux下的vm(虚拟内存)和windows下的作用是一样的,均是防止真实内存资源不足准备的.
 虚拟内存就是swap,Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换.

在Linux中,这个区域叫做swap,一般大小应设置为物理内存的2倍。

1、打开终端,切换到root用户,输入:free -m查看内存状态
[root@lxt lxt]# free -m
             total       used       free     shared    buffers     cached
Mem:           498        357        141          0         27        162
-/+ buffers/cache:        167        331
Swap:         1023          0       1023


2、输入df -B M(或df -m)查看各分区当前使用情况
[root@lxt lxt]# df -B M
文件系统               1M-块        已用     可用 已用% 挂载点
/dev/mapper/vg_lxt-lv_root
                        12875M     4059M     8162M  34% /
/dev/sda7                 194M       14M      170M   8% /boot
tmpfs                     250M        1M      249M   1% /dev/shm
(fdisk -l可查看磁盘分区情况)

3、选择一个较大的分区,建立分区文件:
[root@lxt lxt]# dd if=/dev/zero f=/swapadd bs=1024 count=524288
524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied,13.0709 秒,41.1 MB/秒
以上命令在根目录新建一个名为swapadd,大小为512M的虚拟内存文件

4、移动该文件到空间较大的其他分区:
[root@lxt lxt]# mkdir /mnt/swap
[root@lxt /]# mv swapadd /mnt/swap

5、执行以下命令启用虚拟内存并重启电脑
[root@lxt /]# mkswap /mnt/swap/swapadd
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=a5c8b651-6f64-4414-bb5f-580b742acfce
[root@lxt /]# swapon /mnt/swap/swapadd
查看内存:
[root@lxt /]# free -m
             total       used       free     shared    buffers     cached
Mem:           498        492          6          0         15        302
-/+ buffers/cache:        174        323
Swap:         1535          0       1535

6、如果不需要使用新增的虚拟内存,则输入:
swapoff -v /mnt/swap/swapadd

[root@gamedb ~]# free  m

[root@gamedb tmp]# dd if=/dev/zero f=/tmp/big_swap bs=1024 count=2000000

[root@gamedb tmp]# du -sh /tmp/big_swap

[root@gamedb tmp]# mkswap /tmp/big_swap

[root@gamedb tmp]# swapon /tmp/big_swap

[root@gamedb tmp]# free  m

[root@gamedb tmp]# vi /etc/fstab

# LABEL=SWAP-hda2         swap                    swap    defaults        0 0

  /tmp/big_swap               swap                    swap    defaults        0 0

 

===========================================================================================  

一、 查看内存和swap 大小,发现swap 是内存大小的一半

  [root@gamedb ~]# free -m

             total       used       free     shared    buffers     cached

Mem:      1001        338        662          0          8        307

-/+ buffers/cache:    22        978

Swap:       509          0        509

===========================================================================================  

二、 决定修改swap大小,首先在空间合适处创建用于分区的 swap 文件 

[root@gamedb tmp]# dd if=/dev/zero f=/tmp/big_swap bs=1024 count=2000000

读入了 2000000+0 个块

输出了 2000000+0 个块

(注意:if 表示 infile,of 表示outfile,bs=1024 表示写入的每个块的大小为1024B=1KB(1024B字节=1024*8bit位)

  ===========================================================================================

三、查看创建的文件大小是否符合要求:

[root@gamedb tmp]# du -sh big_swap

2.0G     big_swap

[root@gamedb tmp]# ls -al big_swap

-rw-r--r--  1 root root 2048000000  6  18 11:55 big_swap

  ===========================================================================================

四、将目的文件设置为swap分区文件 

[root@gamedb tmp]# mkswap big_swap

Setting up swapspace version 1, size = 2047995 kB

  ===========================================================================================

五、激活swap,立即启用交换分区文件:

[root@gamedb tmp]# swapon big_swap

  ===========================================================================================

六、再次查看内存和虚拟内存,发现已经被正常修改:

[root@gamedb tmp]# free -m

             total       used       free     shared    buffers     cached

Mem:      1001        984         16          0          2        931

-/+ buffers/cache:    50        950

Swap:     2462          0       2462

  ===========================================================================================

七、若要想使开机时自启用  则需修改文件 /etc/fstab 中的 swap  

[root@gamedb tmp]# vi /etc/fstab

# LABEL=SWAP-hda2         swap                    swap    defaults        0 0

  /tmp/big_swap               swap                    swap    defaults        0 0



附:fstab文件详解:

fstab中存放了与分区有关的重要信息,其中每一行为一个分区记录,每一行又可分为六个部份,下面以 /dev/hda7 / ext2 defaults 1 1 为例逐个说明:

  1. 第一项是您想要mount的储存装置的实体位置,如hdb/dev/hda6

  2. 第二项就是您想要将其加入至哪个目录位置,如/home/,这其实就是在安装时提示的挂入点。

  3. 第三项就是所谓的local filesystem,其包含了以下格式:如extext2msdosiso9660nfsswap等,或如ext2,可以参见/prco/filesystems说明。

  4. 第四项就是您mount时,所要设定的状态,如ro(只读)或defaults(包括了其它参数如rwsuidexecautonouserasync),可以参见「mount nfs」。

  5. 第五项是提供DUMP功能,在系统DUMP时是否需要BACKUP的标志位,其内定值是0。该选项被dump命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0

  6. 第六项是设定此filesystem是否要在开机时做check的动作,除了rootfilesystem其必要的check1之外,其它皆可视需要设定,内定值是0。该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0


第四个选项参数:
ro
以只读模式加载该文件系统
sync
不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度
user
允许普通用户加载该文件系统
quota
强制在该文件系统上进行磁盘定额限制
noauto
不再使用mount a命令(例如系统启动时)加载该文件系统
noexec
(不允许可执行文件可执行,但千万不要把根分区挂为noexec,那就无法使用系统了,连mount 命令都无法使用了,这时只有重新做系统了!
nodev
(不允许挂载设备文件)
nosuid,nosgid
(不允许有suidsgid属性)
nouser
(不允许普通用户挂载)
 

如果想开机就自动挂载(mount)上,可以在/etc/fstab上添加如下几行,同样也可以用mount/etc/rc.d/rc.local里启动:
/dev/hda5 /mnt/d vfat exec,dev,suid,rw,umask=0,iocharset=gb2312,codepage=936 0 0
/dev/hda6 /mnt/e vfat exec,dev,suid,rw,umask=0,iocharset=gb2312,codepage=936 0 0
/dev/hda7 /mnt/f vfat exec,dev,suid,rw,umask=0,iocharset=gb2312,codepage=936 0 0
/dev/hda8 /mnt/g vfat exec,dev,suid,rw,umask=0,iocharset=gb2312,codepage=936 0 0


点赞

发表评论 评论 (1 个评论)

回复 imicman 2016-4-20 21:42
三、/dev/null和/dev/zero的区别 /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! /dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。 /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对命令行和脚本都非常的有用 l 禁止标准输出 #cat $filename >/dev/null 文件内容丢失,而不会输出到标准输出. l 禁止标准错误 #rm $badname 2>/dev/null 这样错误信息[标准错误]就被丢到太平洋去了 l 禁止标准输出和标准错误的输出 #cat $filename 2>/dev/null >/dev/null 如果"$filename"不存在,将不会有任何错误信息提示;如果"$filename"存在,文件的内容不会打印到标准输出。 因此,上面的代码根本不会输出任何信息。当只想测试命令的退出码而不想有任何输出时非常有用。 #cat $filename &>/dev/null 这样其实也可以, 由 Baris Cicek 指出 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

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 8

    获赞
  • 34

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 09:57 , Processed in 0.017263 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部