提高分散式環境中程式啟動效能的一個方法

lzprgmr發表於2013-06-22

假設在linux下,你有一個可執行檔案,其依賴於100個動態庫,而這100個動態庫來自網路中不同的位置,甚至可能來自不同的region,即使網路用的是專用光纖,其網路延遲也不可忽視,那麼在啟動該可執行檔案時發生了什麼:

  • 100個rpath
  • 100個動態庫

為了載入任意一個動態庫,都需要在這100個rpath逐個尋找,假設其實一一對應,那麼查詢的次數為:1+2+3+...100=5050,在分散式的環境中,這個代價是非常大的(根據網路環境的不同,有的甚至能達到10分鐘以上)。

但其實有個蠻簡單的方法,可以完全消除這些無謂的查詢:

把rpath設為只有一個entry,比如當前目錄,然後把這個可執行檔案所有的dependency,symblink到當前目錄

這個想法簡單,實現起來也可以很簡單:

#!/bin/bash -e

test $1

for i in `ldd $1 | grep -o '/[^ ]*'`; do ln -fs $i; done
if test $1 != `basename $1`; then cp $1 .; fi
patchelf --set-rpath `pwd` `basename $1`

 

對於Windows,這個方法應該也是試用的,可以起一個runscript,或者叫做bootstrap的bat指令碼,在裡面設定PATH為當前目錄,並就depenency建立link

相關文章