歡迎您光臨本站 註冊首頁

在Linux x86_64環境下編譯memcached

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

Memcached 是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提供動態、資料庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。但是它並不提供冗餘(例如,複製其hashmap條目);當某個伺服器S停止運行或崩潰了,所有存放在S上的鍵/值對都將丟失。

說簡單一點memcached就是維護著一個位於內存中的大map。它利用RAM的隨機訪問優勢(內存的讀寫速度要比磁碟的讀寫速度快得多,前者是後者的10的6次方倍),將某個對象通過特定的索引值存儲,當需要這個對象的時候通過這個索引值可以立即找出來。索引值在整個內存緩衝系統中是唯一的,也同時對應唯一的一個對象。這樣在涉及查詢數據的操作時加入這樣一種機制即可起到加快訪問速度的效果。

閑話少敘,下面介紹memcached在Linux x86_64環境中的編譯過程。

工作機器各項參數如下:

CPU:Intel Xeon 5110

內存:DDR2 1G*4

主機型號:ProLiant DL140 G3

操作系統:Red Hat Enterprise Linux Server release 5.4 x86_64版

內核版本:2.6.18

gcc版本:4.1.2

g++版本:4.1.2

1.下載memcached源碼包

訪問memcached官方網站http://memcached.org可以下載到最新最穩定版本的memcached源碼包



下載完成後將其解壓view plaincopy to clipboardprint?
01.# cd Download  
02.# ll  
03.total 312  
04.-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz  
05.# tar -xf memcached-1.4.10.tar.gz   
06.# ll  
07.total 316  
08.drwxr-xr-x 6 1000 1000   4096 Nov 10 08:32 memcached-1.4.10  
09.-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz  
# cd Download
# ll
total 312
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
# tar -xf memcached-1.4.10.tar.gz
# ll
total 316
drwxr-xr-x 6 1000 1000   4096 Nov 10 08:32 memcached-1.4.10
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz 2.嘗試配置memcached編譯

進入memcached解壓后的目錄后,執行./configure命令來檢測當前系統環境並生成makefileview plaincopy to clipboardprint?
01.# cd memcached-1.4.10  
02.# ./configure   
# cd memcached-1.4.10
# ./configure  
如果在執行之後發現最後一行有如下提示表明缺少libevent庫:

view plaincopy to clipboardprint?
01.checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/  
02.  
03.      If it's already installed, specify its path using --with-libevent=/dir/  
04.  
05.#   
checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/

      If it's already installed, specify its path using --with-libevent=/dir/

# 這是在編譯memcached過程中經常遇到的問題(memcached基於libevent的事件處理機制。libevent是個程序庫,它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的介面。即使伺服器的連接數增加,也能發揮時間複雜度O(1)的性能。 memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統上發揮其高性能。)。這時就要安裝libevent庫了。在libevent官方網站http://libevent.org中可以下載到最新最穩定版源代碼:


同樣需要解壓並進入解壓后的源碼包目錄:view plaincopy to clipboardprint?
01.# ll  
02.total 1140  
03.-rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz  
04.drwxr-xr-x 6 1000 1000   4096 Nov 20 17:03 memcached-1.4.10  
05.-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz  
06.# tar -xf libevent-2.0.16-stable.tar.gz   
07.# cd libevent-2.0.16-stable  
# ll
total 1140
-rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz
drwxr-xr-x 6 1000 1000   4096 Nov 20 17:03 memcached-1.4.10
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
# tar -xf libevent-2.0.16-stable.tar.gz
# cd libevent-2.0.16-stable 接下來要配置libevent庫的編譯了。這裡的配置需要注意添加--prefix參數,這個參數要指定編譯完成後,如果安裝此庫,庫安裝到哪裡。默認值是/usr/local。如果保持默認值,會將庫安裝到/usr/local/lib目錄中。多數Linux發行版默認的載入庫路徑都不包含此路徑。為了避免麻煩,這裡指定--prefix=/usr。這樣編譯后安裝就會安裝到/usr/lib目錄中了。這個目錄是多數Linux發行版默認的載入庫路徑。

執行配置腳本:view plaincopy to clipboardprint?
01.# ./configure --prefix=/usr  
# ./configure --prefix=/usr 如果你在配置時忘了加這個參數,不要緊,後面還有解決辦法,接著往下看。

配置好之後就可以編譯了:view plaincopy to clipboardprint?
01.# make  
# make 編譯好之後就是用root許可權安裝:view plaincopy to clipboardprint?
01.# sudo make install  
# sudo make install 3.正式編譯memcached

剛剛介紹的是遇到了一個小麻煩時的解決辦法,現在已經不存在libevent庫缺失的問題了,如果你遇到了libevent庫缺失的問題,此時需要回到memcached源碼包目錄,再次執行一次編譯配置腳本:view plaincopy to clipboardprint?
01.# ./configure  
# ./configure 不添加參數直接執行編譯配置腳本,在安裝時將自動安裝到/usr/local/bin目錄中。如果要更改安裝位置,可以添加參數--prefix。例如--prefix=/usr/local/memcached,則安裝時將安裝到/usr/local/memcached/bin中。

檢查沒問題,可以開始編譯了:view plaincopy to clipboardprint?
01.# make  
# make 編譯完成後進行安裝view plaincopy to clipboardprint?
01.# sudo make install  
# sudo make install 然後去看一看是否已經安裝(memcached默認安裝目錄為/usr/local/bin)。轉到memcached目錄,然後啟動memcached加參數-h顯示幫助。幫助第一行即當前memcached版本:view plaincopy to clipboardprint?
01.# cd /usr/local/bin/  
02.# sudo ./memcached -h  
03../memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory  
04.#   
# cd /usr/local/bin/
# sudo ./memcached -h
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
#  如果之前的libevent編譯時加了--prefix=/usr參數,此時執行應該是正常的,會顯示幫助信息。我剛才編譯libevent庫的時候故意沒有加此參數,因此memcached到這一步的時候就會出現上面的問題——無法載入共享庫libevent-2.0.so.5。如果你也遇到了這樣的問題,接著往下看:

在多數linux發行版中,程序啟動后靜態載入的庫默認查找路徑為/lib(64位系統還有/lib64)和/usr/lib(64位系統中還有/usr/lib64),而目前我們編譯的libevent庫安裝路徑不在這些默認庫載入路徑中,因此需要配置庫載入路徑:

先通過ldd命令看一看memcached都需要載入哪些庫:view plaincopy to clipboardprint?
01.# ldd memcached   
02.        libevent-2.0.so.5 => not found  
03.        librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)  
04.        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)  
05.        libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)  
06.        /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)  
07.#   
# ldd memcached
        libevent-2.0.so.5 => not found
        librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
#  此時看到結果第一行:libevent-2.0.so.5 => not found,正是缺少的庫,該庫無法找到。

那這個庫在哪裡呢?我們來問一下系統:view plaincopy to clipboardprint?
01.# whereis libevent-2.0.so.5  
02.libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5  
03.#   
# whereis libevent-2.0.so.5
libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
# 它告訴我們,libevent-2.0.so.5庫存放在/usr/local/lib目錄中。因此我們把這個目錄加入到系統默認的庫載入路徑中。這裡要修改系統環境變數$LD_LIBRARY_PATH。

先看一下當前$LD_LIBRARY_PATH的值:view plaincopy to clipboardprint?
01.# echo $LD_LIBRARY_PATH  
02.  
03.#   
# echo $LD_LIBRARY_PATH

#  當前值為空,說明目前庫載入路徑還是上文提到的/lib(64位系統還有/lib64)和/usr/lib(64位系統中還有/usr/lib64)。接下來使用root許可權修改/etc/profile文件,在文件末尾追加一行:view plaincopy to clipboardprint?
01.export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH  
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH 然後保存,更新一下系統配置:view plaincopy to clipboardprint?
01.# source /etc/profile  
# source /etc/profile 再查看一下默認載入庫路徑:view plaincopy to clipboardprint?
01.# cd /etc/  
02.# source profile  
03.# echo $LD_LIBRARY_PATH  
04./usr/local/lib:  
05.#   
# cd /etc/
# source profile
# echo $LD_LIBRARY_PATH
/usr/local/lib:
#  libevent庫所在的目錄已經添到了系統默認庫載入路徑中了,再次使用ldd命令查看memcached是否能夠完全載入所需的庫:view plaincopy to clipboardprint?
01.# cd /usr/local/bin/  
02.# ls  
03.dialyzer  erl   escript          memcached  run_test  typer  
04.epmd      erlc  event_rpcgen.py  run_erl    to_erl  
05.# ldd memcached   
06.        libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)  
07.        librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)  
08.        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)  
09.        libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)  
10.        /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)  
11.#   
# cd /usr/local/bin/
# ls
dialyzer  erl   escript          memcached  run_test  typer
epmd      erlc  event_rpcgen.py  run_erl    to_erl
# ldd memcached
        libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)
        librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
#  已經都能找到了,看一下版本信息:view plaincopy to clipboardprint?
01.# ./memcached -h  
02.memcached 1.4.10  
03.-p       TCP port number to listen on (default: 11211)  
04.-U       UDP port number to listen on (default: 11211, 0 is off)  
# ./memcached -h
memcached 1.4.10
-p       TCP port number to listen on (default: 11211)
-U       UDP port number to listen on (default: 11211, 0 is off) 已經沒有問題了。


至此memcached的編譯安裝完成

[火星人 ] 在Linux x86_64環境下編譯memcached已經有334次圍觀

http://coctec.com/docs/service/show-post-1684.html