Memcache
目錄
Memcache 1
一、Memcache介紹 1
1.What is Memcache? 1
2.Memcache作用? 1
3.互聯網常見緩存軟件: 1
4.Memcached在企業工作中的應用場景 1
5.Memcached服務的軟件特點 2
6.Memcached工作原理 3
7.Memcached工作原理深入(內存管理機制) 4
Memcached內存管理機制缺點及優化策略 4
二、Memcache部署 4
1.安裝memcached 5
2.Memcached狀態查看 6
3.關閉memcached,測試數據是否丟失 9
4.Memcached服務管理命令 9
三、監控Memcached 10
1.memcache.php 10
2.check_tcp 10
3.Nagios check_memcached插件 12
一、Memcache介紹
1.What is Memcache?
Memcache是一款開源的、高性能的純內存緩存服務軟件,Memcache項目誕生於2003年。Mem就是內存的意思,cache是緩存的意思,d是daemon的意思。Memcache服務分爲服務端和客戶端兩部分,C/S模式。
服務端軟件:memcached-1.4.13
客戶端軟件:memcache-2.25
Memcache官方網站:http://memcache.org
2.Memcache作用?
在啓動Memcached時,會指定一個內存大小參數,然後會被分配一個內存空間。當我們讀取數據庫後的業務數據,放入Memcached緩存中,下一次請求同樣數據的用戶,直接去Memcachd取數據返回給用戶。
這樣做的好處?
(1)對於用戶來說,用戶訪問網站更快了,體驗更好了。
(2)數據庫壓力降低了,內存沒有的時候,就會請求數據庫。
(3)提升網站併發訪問,服務器數量變少。
3.互聯網常見緩存軟件:
Memcached 純內存 用來緩存後端數據庫的數據(用戶信息,帖子,博文等)
Memcachedb 內存+磁盤 新浪開發,Memcacehd+BDB 緩存後端數據庫數據,直接做數據庫用
Redis 內存+磁盤 作用同Memcachedb 主從複製,數據類型更豐富。
squid 內存+磁盤
varinish 內存
緩存靜態圖片,JS,CSS,HTML,視頻等。CDN就是利用這類軟件做的分佈式緩存。
4.Memcached在企業工作中的應用場景
1|作爲數據庫的前端緩存應用
(1)完整緩存(易)
例如:京東的商品分類,就可以事先放到Memcached內存裏,然後在對外提供數據訪問。這個被稱之爲預熱。
此時可以只讀取緩存就能讀到商品分類數據,無需讀取數據庫,所以數據庫的壓力就降下來了。
(2)熱點緩存(難)
熱點緩存一般是指用戶更新的商品,例如淘寶的賣家,當賣新增商品後,淘寶網的程序就會把商品寫入數據庫,然後讀取寫入的數據,把這部分數據,放入Memcached內存中,下一次訪問這個商品的請求直接從Memcached內存中取走了。這種方法用來緩存網站熱點的數據,即Memcached中緩存經常被訪問的數據。
這個過程可以通過程序實現,也可以在數據庫上安裝Memcache插件,直接由數據庫觸發更新內容到Memcached中。
2|Memcached作爲集羣后端的session會話保持
web集羣session共享存儲設置:
默認php.ini中session的類型和配置路徑:
#session.save_handler = files
#session.save_path = "/tmp"
修改成如下配置:
session.save_handler = memcache
session.save_path = "tcp://10.0.0.18:11211"
3|Memcached分佈式緩存
[分佈式應用1]
Memcache支持分佈式,我們在應用服務器上改造,就可以更好的支持。
例如:可以根據key適當進行有規律的,比如以用戶爲主的網站來說,每個用戶都有UserID,那麼可以根據ID來進行提取和存取,比如1開頭的用戶保存在第一臺Memcache服務器上,以2開頭的保存在第二臺Memcache服務器上,存取數據都先按照UserID來進行轉換和存取。
[分佈式應用2]
在應用服務器上通過程序及URL_HASH,一致性哈希算法去訪問Memcached服務
[分佈式應用3]
門戶網站,例如百度,會通過一箇中間件代理(透明)負責請求後端的Cache服務。
[分佈式應用4]
可以用常見的LVS,haproxy做Cache的負載均衡,和普通web應用服務相比,這裏的重點是調度算法,Cache一般會選擇URL_HASH及一致性hash算法。
分佈式緩存集羣:
(1)所有MC服務器內存的內容都是不一樣的。這些服務器內容加起來接近數據庫的容量
(2)通過在客戶端程序或者MC的負載均衡器上用HASH算法,讓同一內容都分配到一個MC服務器
(3)普通的HASH算法對於節點宕機會帶來大量的數據流動(失效),可能會引起雪崩效應
(4)一致性HASH算法可以讓節點宕機對節點的數據流動(失效)降到最低
5.Memcached服務的軟件特點
C/S模式架構
Memcached是一套C/S模式架構的軟件,由C語言編寫,總共2000多行代碼。
協議簡單
使用基於文本行的協議,能通過telnet/nc直接操作Memcached服務存取數據。
異步I/O 模型,使用libevent作爲事件處理通知機制。
libevent是一套利用C開發的程序庫,它將BSD系統的kqueue,Linux系統的epoll等事件處理功能封裝成一個接口,確保即使服務器端的連接數增加也能發揮很好的性能。
key/value鍵值數據類型
被緩存的數據以key/value鍵值形式存在
純內存存取管理模式
Memcached有一套自己管理內存的方式,這套管理方式非常高效,即全部數據都存放於Memcached服務事先分配的內存中,無持久性存儲的設計,和系統內存一樣,重啓系統或Memcached服務,Memcached內存中的數據庫丟失。
當內存中緩存的數據容量達到啓動時設定的內存值時,就自動使用LRU算法刪除過期的緩存數據。也可以對存儲的數據設置過期時間,這樣過期後數據自動被清除,服務本身不會監控過期,而是在訪問的時候查看key的時間戳判斷是否過期。
如果希望重啓後,數據依然保留,那麼就需要類似sina開發的memcacehdb,redis等持久化內存緩存系統。
多個Memcached集羣節點互不通信
各個Memcached服務器之間互相不通信,都是獨立的存取數據,不共享任何信息,並且數據內容應該是不一致的。通過對客戶端的設計,讓Memcached具有分佈式,能支持海量緩存和大規模應用。
淘寶的Tengine支持了一致性HASH模塊
http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html
6.Memcached工作原理
Memcached是一套C/S模式架構的軟件,在服務端啓動服務守護進程可以爲memcached服務器指定監聽的IP地址、端口號、併發訪問連接數以及分配多少內存來處理客戶端的請求參數。
Memcached由C語言開發, 全部代碼2000多行,採用異步I/O模式,其實現方式是基於libevent事件的單進程、單線程的。使用libevent作爲事件通知機制,多個服務器端可以協同工作,但這些服務器端之間是沒有任何通信聯繫的,每個服務器端只對自己的數據進行管理。應用程序端通過制定緩存服務器的IP地址和端口,就可以連接memcacehd服務互相通信。
需要被緩存的數據以key/value鍵值對的形式保存在服務器端預分配的內存區中,每個被緩存的數據都有唯一的標識key,操作Memcached中的數據通過這個唯一標識key進行。緩存到Memcached中的數據僅放置在Memcached服務預分的內存中,而非存儲在Memcached所在的磁盤上,因此存取速度非常快。
由於Memcached服務自身沒有對緩存的數據進行持久性存儲的設計,因此,在服務器端的memcached服務進程重啓之後,存儲在內存中的這些數據就會丟失。且當內存中緩存的數據容量達到啓動時設定的內存值時,就自動使用LRU算法刪除過期的緩存數據。
開發Memcached的初衷就是僅爲內存緩存而設計的,因此並沒有過多考慮數據的永久存儲問題。因此,如果使用memcached作爲緩存數據服務,要考慮數據丟失後帶來的問題,例如:是否可以重新生成數據,還有,在高併發場合數據丟失會不會導致網站架構雪崩。
企業場景如何正確重啓Memcached集羣服務?在前端控制入口訪問量。然後,啓動Memcached集羣並進行數據預熱,所有數據都預熱完畢後,在逐步的開放前端流量。
7.Memcached工作原理深入(內存管理機制)
說Memcached內存管理機制之前,先說一下malloc。
malloc的全稱是memory allocation(動態內存分配),當無法知道內存具體位置的時,想要綁定真正的內存空間,就需要用到動態分配內存。
早期的Memcached內存管理方式是通過malloc分配的內存,使用完後通過free來回收內存。這種方式容易產生內存碎片並降低操作系統對內存的管理效率。加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢,爲了解決上述問題,Slab Allocator內存分配機制就誕生了。
現在的Memcached利用Slab Allocation機制來分配和管理內存的。
Slab Allocation內存分配機制原理是按照預先規定的大小,將內存給Memcached服務的內存預先分割成特定長度的內存塊(chunk),再把尺寸相同的內存塊(chunk)分成組(chunks slabclass),這些內存塊不會釋放,可以重複利用。
Memcached服務器中保存着slab內空閒chunk的列表,根據該列選擇chunk,然後將數據緩存於其中。當有數據存入時,Memcached根據接收到的數據大小,選擇最合適數據大小的slab分配一一個能存下這個數據的最小內存快(chunk)。
例如:有100個字節的一個數據,就會被分配存入112字節的一個內存塊中,這樣會有12字節被浪費掉,這部分空間不能被使用了,這也是SlabAllocator機制的一個缺點。
Memcached內存管理機制小結:
(1)memcached的早期內存管理機制爲malloc(動態內存分配)
(2)malloc產生內存碎片,導致操作系統性能急劇下降
(3)slab內存分配機制可以解決內存碎片問題
(4)memcached服務的內存預先分割成特定長度的內存塊,稱爲chunk,用於緩存數據的內存空間或內存塊,相當於硬盤的block,只不過磁盤的每一個block都是相等的,而chunk只有同一個slab class內纔是相等的
(5)slab class是特定大小的包含多個chunk的集合或者組,一個memcached包含多個slab class,每個slab class包含多個相同大小的chunk
(6)slab機制也有缺點,chunk的空間會浪費。
8.Memcached內存管理機制缺點及優化策略
避免浪費內存的辦法就是,預先計算出應用存入的數據大小,或把同一業務類型的數據存入一個Memcached服務器中,確保存入的數據大小相對均勻,這樣就可以減少內存的浪費。還有一種辦法是,在啓動時指定"-f"參數,能在某種程度上控制內存組之間的大小差異。在應用中使用Memcached時,通常可以不重新設置這個參數,使用默認值1.25進行部署。如果想優化Memcached對內存的使用,可以考慮重新計算數據的預期平均長度,調整這個參數來獲得合適的設置值。
-f<factor> chunk size growth factor(default:1.25!)
memcachked在啓動時制定Growth Factor因子(通過-f選項),就可以控制slab之間的差異。默認值爲1.25
memcached -f 2 vv
二、Memcache部署
1.安裝memcached
(1)安裝libevent
wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
[root@memcached tools]# tar xf libevent-1.4.13-stable.tar.gz
[root@memcached tools]# cd libevent-1.4.13-stable
[root@memcached libevent-1.4.13-stable]# ./configure
[root@memcached libevent-1.4.13-stable]# make && make install
(2)安裝memcached
[root@memcached tools]# tar xf memcached-1.4.13.tar.gz
[root@memcached tools]# cd memcached-1.4.13
[root@memcached memcached-1.4.13]# ./configure
[root@memcached memcached-1.4.13]# make && make install
(3)啓動memcached
配置ld.so.conf路徑防止啓動memcached時報錯
memcached -h
memcached:error while loading shared libraries:libevent-1.4.so.2:cannot open shared object file:
No such file or directory
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
[root@memcached ~]# memcached -d -c10240 -p11211 -m16 -P /var/run/memcached.pid -uroot -l 192.168.51.91
-d 作爲守護進程在後臺運行
-m 指定memcached服務可以緩存數據的最大內存。默認爲64MB
-c 最大併發訪問連接數(default:1024),按照服務器的併發訪問量來設定
-p 指定memcached服務偵聽TCP端口號,默認額外11211
-P 指定pid
-u 運行memcached的用戶
-l 指定偵聽的服務器IP地址
-vv以very vrebose模式啓動,調試信息和錯誤輸出到控制檯
-P設置保存memcached的pid文件($$)
-h 顯示所有可用選項
-f 調優因子
(4)檢查啓動結果
[root@memcached ~]# ps -ef|grep memcached
root 117028 1 0 19:38 ? 00:00:00 memcached -d -c10240 -p11211 -m16 -P /var/run/memcached.pid -uroot -l 192.168.51.91
root 117037 107682 0 19:38 pts/1 00:00:00 grep memcached
[root@memcached ~]# ss -ntulp|grep 11211
udp UNCONN 0 0 192.168.51.91:11211 *:* users:(("memcached",117028,27))
tcp LISTEN 0 128 192.168.51.91:11211 *:* users:(("memcached",117028,26))
[root@memcached ~]#
(5)寫入數據檢查結果
向memcached中添加數據:鍵值對
[root@memcached ~]# printf "set key001 0 0 10\r\nxiaoyi1234\r\n"|nc 192.168.51.91 11211
STORED
[root@memcached ~]# printf "get key001\r\n"|nc 192.168.51.91 11211
VALUE key001 0 10
xiaoyi1234
END
[root@memcached ~]#
[root@memcached ~]# telnet 192.168.51.91 11211
Trying 192.168.51.91...
Connected to 192.168.51.91.
Escape character is '^]'.
get key001
VALUE key001 0 10
xiaoyi1234
END
2.Memcached狀態查看
stats 統計memcached的各種信息
stats settings 可以查看一些memcached設置
stats slabs查看slabs相關情況,通過這個命令能獲取每個slabs的chunk size長度,從而確定數據到底保存在哪個slab
stats items查看items相關情況
stats sizes 查看存在的item個數和大小
stats cachedump查看key value
stats reset 重新統計數據
[root@memcached ~]# printf "stats\r\n"|nc 192.168.51.91 11211
STAT pid 117028
STAT uptime 737
STAT time 1449229825
STAT version 1.4.13
STAT libevent 1.4.13-stable
STAT pointer_size 64
STAT rusage_user 0.003999
STAT rusage_system 0.029995
STAT curr_connections 5
STAT total_connections 22
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 5
STAT cmd_set 2
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 3
STAT get_misses 2
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 250
STAT bytes_written 134
STAT limit_maxbytes 16777216
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT bytes 82
STAT curr_items 1
STAT total_items 2
STAT evictions 0
STAT reclaimed 0
END
####################################################
stats settings
STAT maxbytes 16777216
STAT maxconns 10240
STAT tcpport 11211
STAT udpport 11211
STAT inter 192.168.51.91
STAT verbosity 0
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT num_threads_per_udp 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-negotiate
STAT auth_enabled_sasl no
STAT item_size_max 1048576
STAT maxconns_fast no
STAT hashpower_init 0
STAT slab_reassign no
STAT slab_automove no
END
#######################################################
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 1
STAT 1:free_chunks_end 10920
STAT 1:mem_requested 82
STAT 1:get_hits 4
STAT 1:cmd_set 2
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
##############################################
stats items
STAT items:1:number 1
STAT items:1:age 7998
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
######################################
stats sizes
STAT 96 1
END
####################################
3.關閉memcached,測試數據是否丟失
[root@memcached ~]# printf "set key001 0 0 10\r\nxiaoyi1234\r\n"|nc 192.168.51.91 11211
STORED
[root@memcached ~]# printf "get key001\r\n"|nc 192.168.51.91 11211
VALUE key001 0 10
xiaoyi1234
END
[root@memcached ~]# pkill memcached
[root@memcached ~]# memcached -d -c10240 -p11211 -m16 -P /var/run/memcached.pid -uroot -l 192.168.51.91
[root@memcached ~]# printf "get key001\r\n"|nc 192.168.51.91 11211
END
4.Memcached服務管理命令
操作memcached命令的語法:
<command name> <key><flags><exptime><bytes>\r\n
-<command name>是set,add,repalce
set"存儲此數據"
add"存儲此數據,只在服務器未保留此鍵值的數據時"
replace"存儲此數據,只在服務器曾保留此鍵值的數據時"
-<key>是接下來的客戶端所要求存儲的數據的鍵值
-<flags>是在取回內容時,與數據和發送塊一同保存服務器上的任意16位無符號整形(用十進制來書寫)。客戶端可以用它作爲"位域"來存儲-一些特定的信息;它對服務器是不透明的。
-<exptime>是終止時間。如果爲0,該項永不過期(雖然它可能被刪除,以便爲其他緩存項目騰出位置)。如果非0(Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端無法再獲得這項內容
-<bytes>是隨後的數據區塊的字節長度,不包括"\r\n".它可以是0(這時後面跟隨一個空的數據區塊)。
-<data block>是大段的8位數據,其長度由前面的命令行中的<bytes>指定。
-"STORED\r\n"表明成功。
-"NOT_S"表明數據沒有被存儲,但不是因爲發生錯誤。這通常意味着add或replace命令的條件不成立,或者,項目已經位列刪除隊列。
三、監控Memcached
1.memcache.php
下載地址http://livebookmark.net/memcachephp/memcachephp.zip
vim memcache.php
.....
define('ADMIN_USERNAME','memcache'); // 定義用戶名
define('ADMIN_PASSWORD','password'); // 定義密碼
.....
$MEMCACHE_SERVERS[] = 'mymemcache-server:11211'; //定義要查看的ip和端口
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11212'; //可添加多個
2.check_tcp
通過nagios的check_tcp腳本,信息量太大,不過可以將此信息通過自己編寫腳本自定義監控memcached,不過有現成的Nagios-Plugins-Memcached插件
[root@memcached html]# /usr/local/nagios/libexec/check_tcp -H 192.168.51.91 -p 11211 -t 5 -E -s 'stats\r\nquit\r\n' -e 'uptime' -M crit
TCP OK - 0.001 second response time on port 11211 [STAT pid 119204
STAT uptime 9454
STAT time 1449493920
STAT version 1.4.13
STAT libevent 1.4.13-stable
STAT pointer_size 64
STAT rusage_user 0.193970
STAT rusage_system 0.250961
STAT curr_connections 5
STAT total_connections 270
STAT connection_structures 7
STAT reserved_fds 20
STAT cmd_get 2
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 1
STAT get_misses 1
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1982
STAT bytes_written 264950
STAT limit_maxbytes 16777216
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT bytes 328
STAT curr_items 4
STAT total_items 4
STAT evictions 0
STAT reclaimed 0
END]|time=0.000525s;;;0.000000;5.000000
3.Nagios check_memcached插件
http://search.cpan.org/CPAN/authors/id/Z/ZI/ZIGOROU/Nagios-Plugins-Memcached-0.02.tar.gz
[root@memcached ~]# tar xf Nagios-Plugins-Memcached-0.02.tar.gz
[root@memcached ~]# cd Nagios-Plugins-Memcached-0.02
[root@memcached Nagios-Plugins-Memcached-0.02]# perl Makefile.PL
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- Carp::Clan ...missing.
- Cache::Memcached ...missing.
- FindBin ...loaded. (1.50)
- Nagios::Plugin ...missing.
- Time::HiRes ...loaded. (1.9721)
==> Auto-install the 3 mandatory module(s) from CPAN? [y] y
Can't locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/AutoInstall.pm line 635, <STDIN> line 1.
yum install perl-CPAN -y
[root@memcached Nagios-Plugins-Memcached-0.02]# perl Makefile.PL
[root@memcached Nagios-Plugins-Memcached-0.02]# make && make install
command.cfg
define command{
command_name check_memcached_response
command_line $USER1$/check_memcached -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$
}
define command{
command_name check_memcached_size
command_line $USER1$/check_memcached -H $HOSTADDRESS$ --size-warning $ARG1$ --size-critical $ARG2$
}
define command{
command_name check_memcached_hit
command_line $USER1$/check_memcached -H $HOSTADDRESS$ --hit-warning $ARG1 --hit-critical $ARG2$
}
vim host.cfg
define host{
use linux-server
host_name memcached
alias memcached
address 192.168.51.91
}
vim services.cfg
define service {
use generic-service
host_name memcached
service_description memcached
check_command check_memcached_response!30!40
}
define service {
use generic-service
host_name memcached
service_description memcached_size
check_command check_memcached_size!30!40
}
define service {
use generic-service
host_name memcached
service_description memcached_hit
check_command check_memcached_hit!40!30
}
[root@memcached objects]# /usr/local/nagios/libexec/check_memcached -H 192.168.51.91 -w 30 -c 40
Base class package "Nagios::Plugin" is empty.
(Perhaps you need to 'use' the module which defines that package first,
or make that module available in @INC (@INC contains: /usr/local/nagios/libexec/../lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
at /usr/local/share/perl5/Nagios/Plugins/Memcached.pm line 6
BEGIN failed--compilation aborted at /usr/local/share/perl5/Nagios/Plugins/Memcached.pm line 6.
Compilation failed in require at /usr/local/nagios/libexec/check_memcached line 12.
BEGIN failed--compilation aborted at /usr/local/nagios/libexec/check_memcached line 12.
[root@memcached objects]#
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl-Params-Validate perl-Math-Calc-Units perl-Regexp-Commonperl-Class-Accessor perl-Config-Tiny perl-Nagios-Plugin.noarch
[root@memcached Nagios-Plugins-Memcached-0.02]# /usr/local/nagios/libexec/check_memcached -H 192.168.51.91
MEMCACHED OK - OK