Ptt-official-app / go-bbs

BBS file database manager system library in Golang.
Apache License 2.0
80 stars 43 forks source link

實作 Cache 套件 #34

Closed PichuChen closed 3 years ago

PichuChen commented 3 years ago

雖然套件名稱是 Cache 但實際上是用來讀取 SHM 的套件

初步想法是這樣,目前在測試環境的 SHM 已經被打包下來了,約 44MB, 因此在 Parsing 的時候透過 mmap 的 System call 就能夠讀入記憶體了。

但是根據每個BBS編譯設定不同,欄位所在的記憶體位置也會不同,因此這部分需要動態算出位置,算出位置後下一步就能取得該位置的資料或是將資料寫入該位址。

如果回傳的是 []byte byte slice 的話,那利用者就能自由的讀取和修改某段記憶體位置了(還不用copy) https://play.golang.org/p/vEUqcyc5g94

第一階段因為方便測試,所以用 mmap 打開測試資料,然後上線前改成透過 cgo 開啟 system V SHM 的版本。

大概是這樣的計畫,看有沒有人有興趣或是其他意見。

PichuChen commented 3 years ago

目前實作的進度在 Branch feature/cache 有初步的雛形,可以從 mmap 讀取到 money 了

FATESAIKOU commented 3 years ago

不好意思想請問一下,讀取 mmap 的部分預期打算怎麼實現。

可能是我不熟語言 go 跟 c 的底層,但在我的印象中如果 mmap 中的資料沒有經過序列化純粹是 raw data 的話,不只是編譯參數,包含有關 space locality 之類的記憶體優化都會造成影響。 不知道大大打算怎麼處理?

PichuChen commented 3 years ago

不好意思想請問一下,讀取 mmap 的部分預期打算怎麼實現。

可能是我不熟語言 go 跟 c 的底層,但在我的印象中如果 mmap 中的資料沒有經過序列化純粹是 raw data 的話,不只是編譯參數,包含有關 space locality 之類的記憶體優化都會造成影響。 不知道大大打算怎麼處理?

你指的是 Alignment 的問題嗎?

FATESAIKOU commented 3 years ago

嗯嗯對,然後我想問如果這個 Alignment 在 runtime 透過類似 memalign 的 function 來做管理,要如何在 golang (另一個 process)裡面解析。(因為這邊的影響因素不只是編譯參數,感覺還要把相關的 alignment 的數字傳出來才能解析?)

PichuChen commented 3 years ago

嗯嗯對,然後我想問如果這個 Alignment 在 runtime 透過類似 memalign 的 function 來做管理,要如何在 golang (另一個 process)裡面解析。(因為這邊的影響因素不只是編譯參數,感覺還要把相關的 alignment 的數字傳出來才能解析?)

目前是會傳入 MemoryMappingSetting 這個物件,這個物件中有個 AlignmentBytes

FATESAIKOU commented 3 years ago

喔喔,原來如此。那請問這邊有用到 AlignmentBytes 的實作會在哪裡呢?

https://github.com/Ptt-official-app/go-bbs/tree/7da3dab88110b6a0d65d45a8dfb7b9094fb8e7fd/cache 雖然目前看過這裏的程式碼,但不好意思還是找不太到。

PichuChen commented 3 years ago

喔喔,原來如此。那請問這邊有用到 AlignmentBytes 的實作會在哪裡呢?

https://github.com/Ptt-official-app/go-bbs/tree/7da3dab88110b6a0d65d45a8dfb7b9094fb8e7fd/cache 雖然目前看過這裏的程式碼,但不好意思還是找不太到。

https://github.com/Ptt-official-app/go-bbs/blob/7da3dab88110b6a0d65d45a8dfb7b9094fb8e7fd/pttbbs/cache.go#L72

在這邊

FATESAIKOU commented 3 years ago

不好意思,拖了有點久。 我在這裡整理一下自己的理解。

  1. 所以根據這邊的程式碼來看,這裡是以 AlignmentBytes 已經確定的前提來計算各個欄位的 offset 的意思嗎?(所以開發者不需要擔心 AlignmentBytes 是怎麼計算出來的)
  2. 然後承上,接下來主要需要完成讀取介面的是 #L107 開始到 #L267 中所有的變數嗎?
  3. 這裡的程式碼來看目前還是自己弄一個 Mock 來測試,請問在開發時(或未來規劃)會實際讀取 mmap 檔案來做測試嗎? 如果有這樣的檔案在哪裡呢?

感謝

PichuChen commented 3 years ago

不好意思,拖了有點久。 我在這裡整理一下自己的理解。

  1. 所以根據這邊的程式碼來看,這裡是以 AlignmentBytes 已經確定的前提來計算各個欄位的 offset 的意思嗎?(所以開發者不需要擔心 AlignmentBytes 是怎麼計算出來的)

AlignmentBytes 會在執行其傳入,所以 go-bbs 的使用者要知道目前執行中的系統的 AlignmentBytes 是多少。

  1. 然後承上,接下來主要需要完成讀取介面的是 #L107 開始到 #L267 中所有的變數嗎?

  1. 這裡的程式碼來看目前還是自己弄一個 Mock 來測試,請問在開發時(或未來規劃)會實際讀取 mmap 檔案來做測試嗎? 如果有這樣的檔案在哪裡呢?

有,在這邊: http://pttapp.cc/data-archives/ dump.shm 相關的壓縮檔就是了

感謝