2013年2月18日 星期一

ruby 2.0 bitmap marking 節省的多個 proccess 共用記憶體空間


閱讀 ruby 2.0 garbage collection

http://patshaughnessy.net/2012/3/23/why-you-should-be-excited-about-garbage-collection-in-ruby-2-0

原本的 ruby GC 演算法 mark and sweep:
Ruby 的 String 等物件在 ruby 記憶體配置中,都是由一組 flag/RValue 的雙欄位物件組成,RValue 儲存在 heap 中,當新申請的物件找不到足夠記憶體時,就會啓動 garbage collection(GC), GC 演算法就是去找到哪些 RValue 已經沒人在用可以重新釋放,讓新的物件使用,flag 中有個欄位稱為 FL_MARK,設定 FL_MARK 為 1 表示正在使用中,當整個 heap 檢查完,沒有 mark 的 RValue 就會加入一個 free list,被 sweep (清除),每當使用新的物件或數值就會使用 free list 中的 RValue,當 free list 又被用空後,就會再次執行 mark and sweep 的 GC 產生新的 free list,如此進入新的循環。

如果執行完 mark and sweep 後發現沒有多餘 RValue 可供生成 free list (空的 free list) 該怎麼辦? ruby interpreter 就會產生新的(一次十個) heap 並產生相對應的新 free list 給新物件使用。

Ruby 2.0 嘗鮮版 bitmap marking(號稱比 rubyEE 更快的 GC):使用 copy on write optimization 的 GC 可以讓不同的 heap arrays 共用有相同值的 RValue 物件,也就是多個 process(比如 ruby on rails 有許多共同的網頁物件),但可惜的是再 mark and sweep 演算法中,會把這些共用物件設定為 marked,因此無法繼續享受共用 RValue 來節省記憶體空間。但Phusion Passenger 的 Hongli Lai 已經在 ruby EE中改掉這個 marked as modified object 的問題。而現在 Narihiro Nakamura 的 bitmap marking 修改是放棄 flag/RValue 的資料結構,改在每個 heap header 採用 bitmap 紀錄記憶體是否已使用,因此 mark 的動作,不會再去改到 heap 本身的資料結構,享受到 copy on write optimization 來節省共用物件的記憶體空間了。

另外一個修改是這些 heap header 必須對齊到 2 的次方位置 (posix_memalign, not malloc),優點是計算 heap header 位址的方式較方便

在 heroku 的 ruby on rails 可以在 Gemfile 加上:
ruby "2.0.0"
指定 ruby 版本

因應 ruby(python) interpreter GIL 使用多核心的記憶體問題

閱讀 Malthe Boltche 的 Hog that CPU

http://www.maltheborch.com/2013/02/hog-that-cpu
原本是講 python 但是也有提到 ruby 的部分

使用多核心與記憶體的關係:
Python 跟 Ruby 兩個 script language 因為在 interpreter 採用 GIL,
因此單一 interpreter 會有無法用到多核心效能的問題,

如果要使用多核心的效能,必須為每一個核心各 fork 新增一個
 interpreter 實體,但同時也因此變成吃記憶體的怪獸,比如使用
ruby on rails framework 一個實體就可能吃掉數百 MB 的記憶體
空間,而使用多核心(或新增 ruby process 處理新的 http requrest)時
多產生的 interpreter 實體可能很容易就用完系統記憶體。

Ruby EE, Rubinius 跟 jRuby 一樣採用 copy on write 的 shared
memory 共享記憶體方式,而在 Ruby 2.0 加強的 bitmap marking GC
 algorithm 可以減少 ruby process 在 web framework 的記憶體使用量

而 ruby GC 演算法改進可以看
python 的使用者可能會對 hog that cpu 後半段討論的 CPython 在單
核心使用 mulithreading 但遇到 no thread safe 的討論有興趣。

2013年2月1日 星期五

靜態檢查 python 程式碼的工具

參考 StackOverflow 上關於 Abhijit 跟 Nick Bastin 討論關於靜態檢查
 python 程式碼的工具:

Standard Compliance verification - PEP8

  1. Pylint 
  2. PyFlakes
Metrics

  1. PyMetrics 
  2. Traceback 
  3. objgraph (Python reference chain metrics and debugging)
Code Coverage

  1. Code Coverage

擁抱與氣球

跟家人逛街發生了兩件事,擁抱與氣球。

一開始是帶著 sch 走在路上,有個應該是信仰天主教的信徒(?)
說他感受到天父的熱愛,想要給我一個擁抱,問我是否願意接受,
一開始猶豫了一下,但看起來應該蠻單純的,就讓他抱了一下。

後來在捷運站時,ssh 在跟著我們等捷運列車時,突然收到一位
外國朋友送他一個 hello kitty 氣球,讓他開心了一整晚。

感謝信徒與好心的外國朋友,讓我們有一個特別的夜晚。
;-)