開闢共享記憶體時遇到錯誤

2021-05-23 11:25:18 字數 1651 閱讀 6337

最近需要對tracer服務進行擴容,一來是因為skvs順序寫更快,所以將不相干的服務都移到了pagedb的機器上,這樣就空下來不少記憶體。二來是因為系統初期設計的1.6億條url的容量好像不夠,10月份上線乙個月不到,就已經寫到1.4個億了,所以擴容不得不做。

就在更該共享記憶體的時候,出現了問題。

擴容前,4個ls,每個ls開2g記憶體作為共享記憶體的儲存。

擴容後,4個ls,每個ls開3g記憶體作為共享記憶體儲存。

悲劇也就在此刻發生了,2個ls建立共享記憶體成功,另外2個失敗。ministore在初始化的時候,報了如下的錯誤:

shmget error

: no space left on device

最開始的時候,以為是記憶體裡面buffer太多,導致記憶體分配不出來了。

於是打算先清快取

sync

echo 3 > /proc/sys/vm/drop_caches

然後再試,發現仍然不行。於是baidu之,發現有人問相同的問題,卻沒人給出回答,google之,發現n多老外的程式設計師在不同的郵件列表裡問這個問題,沒過回郵件的人也沒給出答覆。但有乙個人的郵件作為了一些分析,建議出錯的人檢查memory configuration,於是我突然想起了共享記憶體的有幾個引數

shmmax用來表示單個程式可以開的記憶體最大大小,單位是位元組。這個做線上程式之前已經做過改動。

shmmin用來表示共享記憶體中每個頁的最小大小,一般在linux中是4k.

另外乙個引數很關鍵了,shmall,這個表示此前這台機器上能夠開闢共享記憶體的最大值,單位是頁面

所以shmall * shmmin 就是當前這台機器上所有程序總共能開啟的最大內享記憶體的值

擴容前 shmall 為2097152, shmmin為4096,於是最大共享記憶體只能開到8g,剛好是我4個ls開闢共享記憶體的總和。

而擴容後,單個ls開的共享記憶體為3g,所以只能有2個ls能夠建立成功,剩下的失敗。

解決方法,增大shmall的值,然後重啟,搞定。

附上一下linux下清記憶體中清快取的解釋:

有關/proc/sys/vm/drop_caches的用法在下面進行了說明

/proc/sys/vm/drop_caches (since linux 2.6.16)

writing  to  this  file  causes the kernel to drop clean caches,

dentries and inodes from memory, causing that memory  to  become

free.

to  free  pagecache,  use  echo 1 > /proc/sys/vm/drop_caches; to

free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;

to   free   pagecache,   dentries  and  inodes,  use  echo  3  >

/proc/sys/vm/drop_caches.

because this is a non-destructive operation  and  dirty  objects

are not freeable, the user should run sync(8) first.

使用pip時遇到的錯誤

typeerror unsupported operand type s for retry and int 由於國外官方pypi經常被牆,導致不可用,所以我們最好是將自己使用的pip源更換一下,這樣就能解決被牆導致的裝不上庫的煩惱。網上有很多可用的源,清華 linux下,修改 pip pip.co...

安裝openstack時遇到的錯誤

學習opensatck的第一步是安裝devstack來進行本機操作 1.下面命令沒有許可權,解決辦法 切換到root使用者下執行sudo s echo stack all all nopasswd all etc sudoers 2.執行下面命令提示沒有git,解決辦法 sudo apt get i...

Linux共享記憶體之段錯誤

最近為了學習作業系統,練習寫乙個shell,然後其中採用了共享記憶體的方案。然而在共享記憶體初始化的時候移植了之前寫共享記憶體實驗已經成功的初始化 卻出現了段錯誤。主要 如下 include stupidshell.h int loop int shm id char shm buff cmdpoo...