啓用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的區別:
a buffer is something that has yet to be "written" to disk
a 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 |
|
總結:
cache是cpu和內存之間的,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按照其工作原理,又被稱爲塊高緩