memcached源碼分析-----安裝、調試以及如何閱讀memcached源碼,-----memcached

來源:互聯網
上載者:User

memcached源碼分析-----安裝、調試以及如何閱讀memcached源碼,-----memcached


        轉載請註明出處:http://blog.csdn.net/luotuo44/article/details/42639131


安裝:

        安裝memcached之前要先安裝Libevent。現在假定Libevent安裝在/usr/local/libevent目錄了。

        因為memcached安裝後不像Libevent那樣,有一堆標頭檔和庫檔案。安裝後的memcached不是用來編程而直接用來啟動並執行。所以不需要在/usr/local目錄下專門為memcached建立一個目錄。直接把memcached安裝到/usr/local即可。

        在Linux中解壓memcached-1.4.21.tar.gz,然後進入解壓後的目錄。輸入命令下面命令進行配置安裝。

        $./configure --with-libevent=/usr/local/libevent

        $make

        $sudo make install


        memcached的預設安裝目錄就是/usr/local,如果想安裝在自己的目錄,那麼可以configure的時候用--prefix=xxx指定一個目錄。--with-libevent就是用來指明Libevent的安裝目錄的。

        如果安裝目錄是/usr/local那麼現在可以memcached這個可執行程式了,直接在命令列輸入memcached即可,並且此時可以使用命令$man memcached查詢協助手冊。

        假如是安裝在其他目錄,比如/usr/local/memcached目錄,那麼還需要一些配置。首先要配置可執行檔的尋找目錄,需要修改PATH環境變數。在/etc/bash.bashrc檔案最後添加:

        exportPATH=$PATH:/usr/local/memcached/bin

        此時,就可以在shell中能運行memcached命令了。但還不能使用man來查詢memcached的協助手冊。因為該命令的協助手冊沒有在man的查詢目錄上。在/usr/local/memcached/share/man/man1目錄中,有一個memcached.1檔案。把這個檔案拷貝到/usr/local/share/man/man1目錄下。此時就可以man 這個memcached了。



調試:

        如果已經安裝了memcached,那麼先使用$sudo make uninstall命令進行卸載。configure 配置和前面一樣,不需要改變。然後輸入下面命令產生debug版本的memcached。

        $make  CFLAGS="-g -O0"

        $sudo make install

        這樣就行了。然後直接是shell裡面輸入$gdb memcached命令啟動memcached。至於memcached的參數是在啟動gdb之後,使用run命令的時候才輸入的。如所示:

        

        要記得先設定斷點,然後才使用r或者run命令。



啟動命令:

        簡單的啟動命令如下,設定-l和-p分別用來設定ip和監聽的連接埠。-vv是輸出一些運行資訊。

        $memcached  -l 192.168.1.112  -p 8888  -vv



和libevent的關係:

        memcached依賴於libevent。從memcached的編譯就可以知道。閱讀memcached的代碼需要懂得libevent的基本使用,關於libevent的使用例子可以參考《Libevent使用例子,從簡單到複雜》。當然閱讀memcached源碼並不需要閱讀libevent源碼作為基礎,懂得libevent的基本使用即可。假如讀者想閱讀libevent的原始碼,可以參考《libevent源碼分析》系列文章。


和libevent源碼閱讀的難度比較:

        雖然memcached的代碼量比libevent少很多,但閱讀起來卻比libevent難很多。主要原因有:memcached使用了大量的全域變數;各個模組之間的關聯性很強;使用了大量的鎖和很多線程。而libevent的各個模組獨立得比較好,模組間關聯很少,基本上是各個模組完成自己獨立的功能,然後向外界提供使用介面。所以閱讀memcached的代碼更要耐心。另外,閱讀memcached源碼除了需要會用libevent外還需要懂得多線程、socket、管道等等東西的基本使用。當然如果看過《UNIX環境進階編程》那麼就沒有問題了。



如何閱讀memcached原始碼:

        1.找一篇概括性描述memcached的文章。瞭解memcached使用了哪些技術以及memcached內部的各個模組(比如內部有雜湊表、slab記憶體 Clerk、LRU隊列、半同步半非同步等等)。一個日本人寫的《memcached完全剖析》可以看一下,裡面並沒有涉及到代碼只是簡單介紹memcached。

        2.分模組閱讀代碼,可以單獨閱讀slabs.c檔案、assoc.c檔案、items.c檔案。看完一個模組的準系統後,再閱讀另外一個模組的。記住,不要想一次就把整個模組完全看懂。memcached模組間關聯太大的,不可能一次性看懂的。要經常回過頭看之前看過的模組,特別是看到了一些相關聯的東西(比如全域變數)。

        3.雖然分模組閱讀會容易一些,但對於memcached來說還是有點難度。因為memcached模組之間的關聯比較大,不像libevent分得那麼開。關聯一般是通過一些全域變數。但memcached使用了很多很多很多全域變數,所以閱讀代碼的時候要注意全域變數是否有static修飾符(如果有的話就心裡暗喜吧)。另外,在閱讀某一個模組的時候,要假設這些全域變數取預設值並且不會變,這樣閱讀起來會容易一點。相當部分的全域變數是結構體變數settings的成員變數。全域變數settings的很多成員都可以在啟動memcached的時候通過參數設定,但閱讀的時候就假定沒有設定。全部成員都取預設值。settings_init函數是用來給全域變數settings的各個成員賦預設值的。每次閱讀代碼的時候建議都開啟這個函數方便隨時查看各個成員的預設值。

        4.memcached使用了大量的鎖和多個線程(非worker線程),閱讀時不要理會這些鎖和線程。看到鎖就跳過,假定沒有鎖是安全執行緒的。對於那些非worker線程,就假定沒有這個線程。哈哈!

        5.有一些功能是要開啟才有的,比如LRU爬蟲功能。在閱讀代碼的時候就假設沒有開啟這個功能。這個功能一般是通過全域變數的值而決定開啟還是不開啟的。那麼在看到這個全域變數時,就直接把其取為不開啟的值。

        至於代碼的讀取順序,可以參考本系列博文的寫作順序。簡單來說就是從簡單到複雜、從單一的結構到總體。




參考:

        http://blog.csdn.net/unix21/article/details/15501049




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.