遇到的问题
使用树莓派编译程序的时候,我遇到了程序比较大,编译到某个文件的时候树莓派会死机,关机之后重启可以继续使用,但是编译到同一个地方树莓派又死机的问题。
这个问题出现的主要原因是我给树莓派安装的Ubuntu mate 16.04 系统默认设置的swap交换空间不够,而编译某些文件的时候需要较大的交换空间,树莓派的交换空间被用满所以树莓派看起来好像是死机了的样子。
解决方法,扩展Ubuntu的交换空间。
这里使用的方法参照了前人的博客,深表感谢。
第一步:确保系统中有足够的空间来用做swap交换空间,我准备在一个独立的文件系统中添加一个swap交换文件,在/opt/image中添加2G的swap交换文件
sudo mkdir image
sudo touch swap
第二步:添加交换文件并设置其大小为2G,使用如下命令
sudo dd if=/dev/zero of=/opt/image/swap bs=1024 count=2048000
过段时间就返回如下结果:
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 242.095 s, 8.7 MB/s
PS:这个步骤说的好像很快的样子,但是给我等的都有点怀疑人生了,我一度以为又死机了,重启了2次,最后耐下心来等了几分钟,终于成功了,眼泪都要掉下来了。
第三步:创建(设置)交换空间,使用命令mkswap
sudo mkswap /opt/image/swap
Setting up swapspace version 1, size = 2 GiB (2097147904 bytes)
第四步:检查现有的交换空间大小,使用命令free
free -m
total used free shared buff/cache available
Mem: 925 185 28 14 711 660
Swap: 0 0 0
或者检查meminfo文件
grep SwapTotal /proc/meminfo
第五步:启动新增加的2G的交换空间,使用命令swapon
sudo swapon /opt/image/swap
第六步:确认新增加的2G交换空间已经生效,使用命令free
free -m
total used free shared buff/cache available
Mem: 925 328 56 32 541 502
Swap: 1999 0 1999
或者检查meminfo文件
grep SwapTotal /proc/meminfo
第七步:修改/etc/fstab文件,使得新加的2G交换空间在系统重新启动后自动生效
sudo vim /etc/fstab
在文件最后加入:
/opt/image/swap /swap swap defaults 0 0
重启之后再次编译,YES,成功!!
---------------------
Linux中Swap分区的相关知识
linux swap交换空间
linux内存通过 virtual memory 虚拟内存来管理整个内存, 虚拟内存管理着物理内存,也管理着swap交换空间。
swap的使用场景
swap主要有两个用处
1、当系统需要比物理内存更多的内存空间的时候,内核会把内存里边用得比较少的内存页面swap out到交换分区,以空出物理内存给当前应用来快速运行。
2、某些应用启动的时候初始化但是随后的应用运行期间不再使用的内存页面,系统会把这部分页面也swap out到交换空间,以留出物理内存页面给其他应用或者磁盘缓存。
linux的这种内存管理策略主要用来节约物理内存,提升当前应用的执行速度。但是swap不能当做扩充内存的一个手段,因为swap读写属于磁盘io,要比物理内存的io慢得多。
如果系统频繁的swap out内存页面到交换分区,随后又swap in交换分区到内存页面,这说明系统在寻找空闲内存来是多个应用同时运行,也就是说当前系统任务比较繁忙,但是可用内存又不足了,这时候唯一的办法只能通过提高物理内存来解决。
因此衡量一个系统内存用量是否到了瓶颈,就可以通过观察swap用量和si so的频率来评估。
生成swap
swap空间有两种形式:一是交换分区,二是交换文件。总之对它的读写都是磁盘操作。
1、交换分区
交换分区可以在安装操作系统的时候分配,也可以进入系统后用fdisk来划分一个交换分区
比如在磁盘上划分一个/dev/sda5分区,然后标记为交换分区。
然后使用mkswap命令在该分区上面建立交换分区文件系统:
mkswap /dev/sda5
最后**交换分区:
swapon /dev/sda5
2、交换文件
交换空间也可以是文件,只需要用dd命令在磁盘上建立分配了大小的文件/home/swapfile
建立交换分区文件系统
mkswap /home/swapfile
最后**它
swapon /home/swapfile
swap空间大小的分配策略
swap空间大小的分配众说纷纭,有说物理内存两倍的,有说物理内存一样大小的,也有说物理内存一半的。在不同场景下,这些说法应该都是对的。
无论是windows系统还是linux系统,除了物理内存外,都还有一个虚拟内存。在linux上,虚拟内存被称为swap space。过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内存的大小至少都有了好几个GB,如果16G内存用32G的swap岂不是太占用硬盘空间?
上图是虚拟内存和交换空间的映射关系,虚拟内存的存在,可以提高电脑的运行速度,所以其存在很有意义。
我们看看redhat的官方答复是怎么说的:
总结起来就是,如果不打算开启休眠功能,物理内存在8G以下,则swap设置为与物理内存一样大。如果物理内存在8G以上,swap空间设置为8G即可。当物理内存大于64G时,不建议开启休眠功能。
以下是Ubuntu的指南,更加细致:(从左至右依次是RAM大小,不开启休眠,开启休眠,最大值)
swap优化
linux内2.6增加一个新参数来管理swap,叫做swappiness ,Swappiness 可以有 0 到 100 的值。设置这个参数为较低的值会减少内存的交换,从而提升一些系统上的响应度。
值越高,内存页面越多的swap out到交换空间,值越低,越多的应用使用物理内存空间。因此要想最大限度的使用物理内存,应该尽量减小swappiness的值甚至设置为0。
linux默认设置为60,临时修改它的值:
echo 10 > /proc/sys/vm/swappiness
要永久修改可以在/etc/sysctl.conf文件修改vm.swappiness参数