解決內存不足導致錯誤的問題—交換空間(swap)


1. 問題調研

  • mysql問題:error-establishing-a-database-connection-problem;

    1. 發現error establishing a database connection的問題——稍微查一下就知道是數據庫的問題
    2. 去查數據庫mysql的err log。具體位置應該是在/var/log/mysqld.log
    3. 查了以后我就發現是 out of memory,Cannot allocate memory for the buffer pool的問題了
    4. google了一下,這種問題有兩種解決方法:
      • 一種方法就是增加swap文件,一般這種方法就足夠解決問題。
      • 另一種就是修改你的innodb_buffer_pool_size
  • 編譯時報錯virtual memory exhausted: Cannot allocate memory 或 c++: internal compiler ereor: killed(program cciplus)

    1. 查詢原因,確認是內存空間不足導致,直接添加內存或采用交換空間方式解決;

2. Swap空間

  Swap分區在系統的物理內存不夠用的時候,把硬盤空間中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什么操作的程序,這些被釋放的空間被臨時保存到Swap分區中,等到那些程序要運行時,再從Swap分區中恢復保存的數據到內存中。

先來說下swap的工作原理:

  swap 的工作我們可以看成是一個靜態的中轉裝置。假如我們的內存是512M的。當有任務來了但是由於之前任務和並發任務占有了許多的工作空間,使得這個工作的位 置要大於512M的空間時,就會導致啟動失敗。因為沒有它的位置。這個時候許多的工程師和技術牛人們就發明了這個swap空間,即虛擬內存的技術。 swap空間實際是在硬盤上的。工作原理是:當我們有 一個任務來到的時候,發現物理內存空間不夠了,那么我們把這之前用戶開啟了但是經常沒有使用的空間給釋放出來,將他們的一些信息存入swap空間。然后給 這個后來的程序先用物理內存空間,當我要用到之前的程序的時候我們再從swap空間將之前保存的內容調用回來。

  增加swap空間的兩種方法:第一種是創建一個swap分區,第二種是創建swap文件,這里我們介紹第二種比較簡單的方法

1、查看本機有沒有已經配置的swap空間,利用下面的命令可以看到swap空間的使用情況

 

 

 如沒有配置swap空間,發現敲完上面命令什么也沒有。如果已配置,會出現下面的狀態,本人服務器上配置的是1G:

 還有一種方法就是用free,它會顯示出系統整體的內存使用情況。

 

 

2、查看可用的硬盤空間,因為swap空間實際上要用的是硬盤空間,所以,當然你要查看還有多少硬盤空間可設置swap

 

 

 3、創建一個swap文件,並更改其權限

創建緩存文件
網上有很多方法,例如:sudo fallocate -l 2G /swapfile,
但是容易報錯:fallocate: /swapfile: fallocate failed: Operation not supported
目前未找到原因,所以只好用另一種方式 ,設置1G空間:

 

 

一般建議設置swap空間大小與為物理內存大小2倍,根據情況而定。if 表示infile,一般不做修改; of表示outfile,設置為想要創建文件夾全路徑; bs=1024代表增加的模塊大小B,count=1024000代表1024000個模塊,也就是1G空間。之后會發現這個文件的可讀權限是開發給任何人的,這樣非常不安全,因此我們要改變一下這個文件的權限。

 

 

我們查看這個文件的權限

 4、使用這個swap文件

使用下面這個命令,告訴系統我們要把這個文件作為swap文件了

 

 

 然后就是要使用這個swap文件了:

 

 

然后我們再用free -m命令查看內存的使用情況,會發現這個swap文件已經ok了!

5、使得這個新加入的swap文件永久生效。

如果需要在系統啟動的時候就生效,我們要在/ect/fstab文件里加入下面一行

先用vi打開文件,然后添加下面一行,然后保存。

 

 

 重啟檢查是否已完成配置

 6.取消swap  

1)查看swap文件位置

 

 

2)取消swap、刪除文件

 

 

3)檢查

 

 

 7.更改Swap配置(依賴度)

1)查看依賴度

 

 

swappiness值的范圍為0-100,值越高代表對swap依賴程度越高,但是swap是基於文件儲存的緩存交換機制,所以效率明顯低於物理內存,swappiness值過高的情況下容易導致物理內存遠遠沒有耗盡便開始使用swap;一般來說swappiness值可以設置為10-60,ssd可以設置的高一點;

2)修改當前swappiness值為30,重啟后失效

 

 

3)更改系統配置值,重啟后依舊有效

 

 

3. 修改innodb_buffer_pool_size

建議從參考文章  https://blog.csdn.net/sunny05296/article/details/78916775

轉載自:https://turbock79.cn/?p=212


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM