swShareMemory_mmap_create:mmap(248000096) failed / Error: Cannot allocate memory[12]

啓用swoole時報的錯誤,可以確定是內存問題


[2019-04-09 09:04:32 @220.0]    WARNING swShareMemory_mmap_create: mmap(260046944) failed. Error: Cannot allocate memory[12]
[2019-04-09 09:04:32 @220.0]    ERROR   calloc[1] failed

    我們查看下內存:

 

[root@VM_0_17_centos docker]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         495          85         116         412         216
Swap:             0           0           0

    swap全都是0明顯有問題,那就加點swap:

 

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 #增加1G的
sudo mkswap /swapfile
sudo swapon /swapfile
[root@VM_0_17_centos docker]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         494          72         116         426         217
Swap:          1023         419         604

 

    然後就順利啓用swoole了。

 

 

free -m命令詳解

[root@localhost ~]# free -m

             total       used       free     shared    buffers     cached

Mem:          7869       7651        218          1        191       5081

-/+ buffers/cache:       2378       5490

Swap:          478        139        339


total1:表示物理,內存總量1,2表示1,2行的內容

used1:總計分配給緩存(包含Buffer和cache)使用的數量,但其中可能部分緩存並未實際使用

free1:未被分配的內存

shared1:共享內存,一般系統不會用到,這裏也不討論

buffers1:系統分配但未被使用的buffers數量

cached1:系統分配但未被使用的cache數量

used2:實際使用的buffers和cache總量,也是實際使用的內存總量

free2:未被使用的Buffers和cache和未被分配的內存之和,這就是系統當前實際可用內存。

如下公式:

buffer和cache也是內存的一部分,如果需要,可以釋放這2部分的內存

pagecache和buffercache的區別:

pagecache實際上是針對文件系統的,是文件的緩存,在文件上的數據會緩存到pagecahce,文件的邏輯層需要映射到實際的物理磁盤,這種映射關係由文件系統來完成,當pagecache中的數據需要刷新時,pagecache中的數據交給buffercache。但這種處理在2.6版本內核之後就變得簡單了,沒有真正意義的cache操作。

buffercache是針對磁盤塊的緩存,也就是在沒有文件系統的情況下,直接對磁盤操作的數據會緩存到buffercache中,如:文件系統的元數據都會緩存到buffercache中。簡單來說,

pagecache用來緩存文件數據,buffercache用來緩存磁盤數據。在有文件系統的情況下,對文件操作,數據會緩存到pagecache。若直接採用dd工具對磁盤進行讀寫,那麼數據會

緩存到buffercache。

cache和buffer的區別:

buffer is something that has yet to be "written" to disk

cache is something that has been "read" from the disk and stored for later use

對於共享內存(shared memory) :主要用於在unix下不同進程間共享數據,是進程間通信一種方法,一般的應用程序不會申請共享內存。

cache:高速緩存,是位於CPU和主內存間一種容量較小但速度很高的存儲器。由於CPU從主內存獲取數據要等待一段時間,cahce中保存這CPU剛用過或循環使用的一部分數據,CPU再次使用該部分數據時,可從cache中直接調用,這樣就減少了CPU的等待時間。cache又分爲L1和L2,L2早期焊在主板上,現在都在CPU中。常見的L2容量有256KB和512KB

3.free中的buffer和cache都是基於內存

buffer作爲buffercache的內存,是塊設備的讀寫緩衝區,

cache作爲pagecache的內存,文件系統的cache

如果cache的值很大,說明cache中的文件數很多,如果頻繁訪問到的文件都能被cache住,那麼磁盤的讀IO必會非常小。

如何釋放cachememory:

1

2

3

4

5

6

7

8

To free pagecache:

echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

  

#注意,釋放前最好sync一下,防止丟失數據,但是<strong>一般情況下沒有必要手動釋放內存<br></strong>

總結:

cachecpu和內存之間的,buffer內存和磁盤之間的,都是爲了解決速度不對等的問題。

緩存(cache)是把讀取過來的數據保存起來,重新讀取時若命中,就不去硬盤了,若沒有命中就去讀硬盤,其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀取的內容不斷往後排,直至從中刪除。

緩衝(buffer)時根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的的反覆尋道,從而提高系統性能,linux有一個守護進程定期清空緩衝內容(即寫入磁盤)。

也可以通過sync命令手動清空緩衝。舉個例子:我這裏有個ext2的的u盤,我往裏面cp一個3M的mp3,但u盤的燈沒有跳動,過了一會(或者手動輸入sync),U盤的燈就跳動起來了。卸載設備時會清空緩存,所以有時候卸載一個設備要等上幾秒中。

修改/etc/sysctl.conf中的vm.swappiness右邊的數字可以在下次開機時調節swap使用策略。該數字範圍是0~100,數字越大越傾向於使用swap。默認爲60,可以改一下試試。–兩者都是RAM中的數據。

buffer是即將要寫入磁盤的,而cache是被從磁盤中讀出來的

buffer由各種進程分配,被用在如輸入隊列等方面。一個簡單的例子是某個進程要求有多個字段讀入,在所有字段被讀入完整之前,進程把先前讀入的字段放在buffer中保存。

cache經常被用在磁盤的I/O請求上,如果有多個進程要訪問某個文件,於是該文件被做成cache以便下次被訪問,這樣可以提高系統性能。

Buffer Cachebuffer cache,又稱bcache,其中文名稱爲緩衝器高速緩衝存儲器,簡稱緩衝器高緩。另外,buffer cache按照其工作原理,又被稱爲塊高緩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章