virtual memory exhausted: Cannot allocate memory

问题描述

腾讯云服务器配置:1G内存、单核CPU、50G硬盘

MySQL 在编译阶段 提示虚拟内存空间不足——virtual memory exhausted: Cannot allocate memory

MySQL 在编译阶段提示内容,如下:

[ 45%] Building CXX object sql/CMakeFiles/sql.dir/discover.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/field.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/field_conv.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/filesort.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/filesort_utils.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/aggregate_check.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/geometry_rtree.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/gstream.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/handler.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/hostname.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/init.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/item.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/item_buff.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/item_cmpfunc.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/item_create.cc.o
[ 45%] Building CXX object sql/CMakeFiles/sql.dir/item_func.cc.o
[ 46%] Building CXX object sql/CMakeFiles/sql.dir/item_geofunc.cc.o
virtual memory exhausted: Cannot allocate memory
sql/CMakeFiles/sql.dir/build.make:949: recipe for target 'sql/CMakeFiles/sql.dir/item_geofunc.cc.o' failed
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 1
CMakeFiles/Makefile2:7883: recipe for target 'sql/CMakeFiles/sql.dir/all' failed
make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
root@VM-0-4-ubuntu:/opt/apps/backup/mysql-5.7.25# 

解决方案

发生该问题的原因是服务器的内存不够,从而导致编译失败。

而购买的Linux服务器,未给你分配虚拟内存,所以可以通过自行增加虚拟内存的方法予以解决。 free -mh

[root@iZ25p0h5gthZ ~]#  free -m
             total       used       free     shared    buffers     cached
Mem:           994        707        287          0         11         57
-/+ buffers/cache:        638        356
Swap:            0          0          0

第二步

[root@iZ25p0h5gthZ ~]# mkdir /opt/img/            
[root@iZ25p0h5gthZ ~]# rm -rf /opt/img/swap
[root@iZ25p0h5gthZ ~]# dd if=/dev/zero of=/usr/img/swap bs=1024 count=2048000          
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB) copied, 48.7514 s, 43.0 MB/s

第三步

[root@iZ25p0h5gthZ ~]# mkswap /opt/img/swap           
mkswap: /usr/img/swap: warning: don't erase bootbits sectors
        on whole disk. Use -f to force.
Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=9982f566-9e44-4495-be0b-51d309873112
[root@iZ25p0h5gthZ ~]# swapon /opt/img/swap
[root@iZ25p0h5gthZ ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           994        924         70          0          1        269
-/+ buffers/cache:        653        340
Swap:         1999          0       1999

使用完毕后可以关掉swap

[root@iZ25p0h5gthZ img]# swapoff swap 
[root@iZ25p0h5gthZ img]# rm -f /opt/img/swap

扩展

1.内存交换空间(swap)的构建

安装Linux时一定需要的两个分区:根目录和swap(内存交换空间)。

swap的功能:在应付物理内存不足的情况下所造成的内存扩展记录的功能。

物理内存不足的时候,swap使用硬盘来暂时放置内存中的信息。

设置一个swap分区

创建一个虚拟内存的文件

1.1 使用物理分区构建swap

针对没有建立swap分区的情况,基本用不到。在已建立swap分区情况下,直接跳到第二部分(创建虚拟内存文件)。

  • 分区
    先用fdisk在磁盘中分个区出来作为swap。然后设置一下system ID(Linux的fdisk会默认将分区ID设为Linux的文件系统)。

  • 格式化
    利用“mkswap 设备文件名”新建swap格式分区(格式化该分区为swap格式)。

  • 使用
    “swapon 设备文件名”将此swap设备启动。

  • 查看
    “free”查看内存使用情况。

1.2 使用文件构建swap

使用dd命令在/tmp下新增一个128MB的文件

 sudo -s     #进入root用户模式
 dd if=/dev/zero of=/swap bs=1024 count=1M #创建一个大小为1G的文件/swap
 ll -h /swap    #可以看到已为/swap分配了1G

使用mkswap将/tmp/swap文件格式化为swap的文件格式

 mkswap /swap

使用swapon将/tmp/swap启动

 free          #查看
 swapon /swap    #启动/swap
 free          #查看
 swapon -s          #查看
 echo "/swap/swap    swap    swap  defaults    0 0"  >> /etc/fstab    #设置成永久生效

虽然现在已经生效,但是等下次虚拟机重启之后,该swap虚拟磁盘会失效。所以要加上最后一步。

虚拟机重启后若仍想使用,用root权限打开/swap即可使用。

 sudo -s
 swapon /swap

使用swapoff关闭swap file

 swapoff /swap
 free

参考:
博客园 - 踏雪无痕SS
博客园 - 雨天的小尾巴

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22