溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

memcached演練(5) 內(nèi)存管理

發(fā)布時(shí)間:2020-08-05 18:32:29 來(lái)源:網(wǎng)絡(luò) 閱讀:858 作者:randy_shandong 欄目:大數(shù)據(jù)

memcached 是高性能的分布式內(nèi)存緩存服務(wù)器。一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài) Web 應(yīng)用的速度、提高可擴(kuò)展性。很顯然,弄清楚它的內(nèi)存存儲(chǔ),很有必要。還是那句話,不需要兜書包了,把自己整理的相關(guān)memcached內(nèi)存管理方面的框架圖分享一下。

memcached演練(5) 內(nèi)存管理


個(gè)人喜歡把內(nèi)存管理,分為3個(gè)學(xué)習(xí)單元。

  1. 如何分配內(nèi)存?

  2. 如何回收內(nèi)存?

  3. 如何監(jiān)控內(nèi)存?

當(dāng)然,本文的主要演練重點(diǎn)也有了。

  1. 內(nèi)存如何分配

  2. 內(nèi)存如何回收

  3. 認(rèn)識(shí)監(jiān)控參數(shù)

  4. 驗(yàn)證一些邊界數(shù)據(jù)

1.如何分配內(nèi)存?

  1.1 默認(rèn)啟動(dòng)內(nèi)存分配情況

memcached演練(5) 內(nèi)存管理

這段輸出日志,可以分成2部分閱讀。第一部分是slab內(nèi)存分配信息;第二個(gè):?jiǎn)⒂帽O(jiān)聽(tīng)情況。

有3點(diǎn)沒(méi)太搞清楚。

  1. 為什么每次啟動(dòng)都是2個(gè)"send buffer....",而且都是28,32。

  2. 每個(gè)server listening前面的26-35的數(shù)字編號(hào)是何含義?為什么不從0開始。

  3. 括號(hào)里面的udp,是說(shuō)明監(jiān)聽(tīng)UDP類型協(xié)議嗎?監(jiān)聽(tīng)TCP協(xié)議監(jiān)聽(tīng)呢呢?

有對(duì)這一塊比較清楚的麻煩指導(dǎo)下,但還好不清楚這幾點(diǎn)不影響大局。

1.2 自定義啟動(dòng)規(guī)則

接下來(lái),通過(guò)修改下啟動(dòng)參數(shù),看下輸出的日志。對(duì)比學(xué)習(xí)下。

memcached演練(5) 內(nèi)存管理

通過(guò)對(duì)比,我們很容易理解一些基本概念。chunk size,增長(zhǎng)因子。

值得一提的的有一個(gè)指標(biāo)。

## -t 4時(shí),監(jiān)控curr_connections
## 4*2+2=10
[root@hadoop1 hadoop]# echo stats | nc 127.0.0.1 11211 |grep connection
STAT curr_connections 10
## -t 2時(shí),監(jiān)控curr_connections
## 2*2+2=6
[root@hadoop1 hadoop]# echo stats | nc 127.0.0.1 11211 |grep connection
STAT curr_connections 6

3. 監(jiān)控保存數(shù)據(jù)前后slab信息

保存數(shù)據(jù)之前監(jiān)控slabs信息如下

[root@hadoop1 hadoop]# echo stats slabs | nc 127.0.0.1 11211
STAT active_slabs 0
STAT total_malloced 0

保存數(shù)據(jù)之后監(jiān)控slabs信息如下

set key 1 1 1
1
STORED
set key2 1 0 1
1
STORED
set key2 1 0 1
1
STORED
set key3 1 0 1
3
STORED

[root@hadoop1 hadoop]# echo stats slabs | nc 127.0.0.1 11211
STAT 1:chunk_size 80
STAT 1:chunks_per_page 13107
STAT 1:total_pages 1
STAT 1:total_chunks 13107
STAT 1:used_chunks 2
STAT 1:free_chunks 13105
STAT 1:free_chunks_end 0
STAT 1:mem_requested 108
STAT 1:get_hits 0
STAT 1:cmd_set 4
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 1048560
END

通過(guò)分析日志,可以很清楚的知道,發(fā)起的操作記錄。

共發(fā)起了4個(gè)set或add操作.使用了2個(gè)大小為80的chunk。

值得一提下,保存的數(shù)據(jù)都非常小,卻占用了160字節(jié)。好心疼浪費(fèi)的存儲(chǔ)空間啊。

通過(guò)監(jiān)控total_malloced指標(biāo),還驗(yàn)證了,memcached采用預(yù)分配,分組管理方式。

當(dāng)真正有數(shù)據(jù)保存時(shí),才真正分配內(nèi)存空間。而且,只有slab class被使用了之后,才能通過(guò)stat slabs監(jiān)控到。

2.內(nèi)存如何回收

內(nèi)存回收不太方便驗(yàn)證,LRU算法使用情況,我們可以從側(cè)面驗(yàn)證下。

我的演練思路:批量添加等大小的數(shù)據(jù)。然后dump出想要數(shù)據(jù),確認(rèn)下最小的KEY。

雖然簡(jiǎn)單粗暴,但大體可以說(shuō)明LRU算法吧。

2.1 準(zhǔn)備批量添加數(shù)據(jù)代碼

使用的是《memcached演練(2) 訪問(wèn)memcached服務(wù) 》提到的spymemcached

public void test111() throws ExecutionException, InterruptedException {
    final MemcachedClient mcc = MemcachedUtil.getSpyMemcachedClient();
   final Lock lock = new ReentrantLock();
    final String value="abcdef.....";
    //不停的set值
  Thread t1=  new Thread(new Runnable() {
        @Override
        public void run() {
            for(int i=0;i<10000000;i++){
            //    System.out.println("i="+i);
                try {
                    TimeUnit.MILLISECONDS.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String key = "lrutestkey_"+StringUtils.leftPad(""+i,10,"0");;
                mcc.set(key, 19000, value);
            }
        }
    },"setting data");
          t1.start();
    t1.join();
    mcc.shutdown();
}

簡(jiǎn)單dump了幾次,片段如下

[root@hadoop1 scripts]# ./memcached-tool localhost:11211 dump |grep add |sort |head -n 10
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 13512
Dumping bucket 10 - 13512 total items
add lrutestkey_0000000000 0 1471172545 512
add lrutestkey_0000000001 0 1471172545 512
add lrutestkey_0000000002 0 1471172545 512
...

add lrutestkey_0000002688 0 1471172763 512
[root@hadoop1 scripts]# ./memcached-tool localhost:11211 dump |grep add |sort |head -n 10
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 7530
Dumping bucket 10 - 7530 total items
add lrutestkey_0000002665 0 1471172762 512
add lrutestkey_0000002670 0 1471172762 512
...

[root@hadoop1 scripts]# ./memcached-tool localhost:11211 dump |grep add |sort |head -n 10
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 7530
Dumping bucket 10 - 7530 total items
add lrutestkey_0000005142 0 1471172787 512
add lrutestkey_0000005143 0 1471172787 512
add lrutestkey_0000005144 0 1471172787 512
...

[root@hadoop1 scripts]# ./memcached-tool localhost:11211 dump |grep add |sort |head -n 10
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 7530
Dumping bucket 10 - 7530 total items
add lrutestkey_0000016755 0 1471172903 512
add lrutestkey_0000016760 0 1471172903 512
...

[root@hadoop1 scripts]# ./memcached-tool localhost:11211 dump |grep add |sort |head -n 10
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 7530
Dumping bucket 10 - 7530 total items
add lrutestkey_0000035102 0 1471173087 512
add lrutestkey_0000035103 0 1471173087 512
add lrutestkey_0000035110 0 1471173087 512
...

對(duì)比這5個(gè)片段,dump出最小的鍵值是越來(lái)越大,這說(shuō)明,隨著數(shù)據(jù)的增加,因?yàn)樵叫〉腒EY,數(shù)據(jù)越老,所以優(yōu)先會(huì)被踢出?;究梢哉f(shuō)明LRU算法邏輯。

還有一點(diǎn),要說(shuō)嗎,踢出數(shù)據(jù)的過(guò)程,是按時(shí)間點(diǎn)進(jìn)行的,不是時(shí)刻進(jìn)行的。

3.監(jiān)控slab參數(shù)

3,1 插入了100條數(shù)據(jù),監(jiān)控結(jié)果

[root@hadoop1 scripts]# echo stats slabs | nc 127.0.0.1 11211
STAT 10:chunk_size 696
STAT 10:chunks_per_page 1506
STAT 10:total_pages 1
STAT 10:total_chunks 1506
STAT 10:used_chunks 100
STAT 10:free_chunks 1406
STAT 10:free_chunks_end 0
STAT 10:mem_requested 58400
STAT 10:get_hits 0
STAT 10:cmd_set 100
STAT 10:delete_hits 0
STAT 10:incr_hits 0
STAT 10:decr_hits 0
STAT 10:cas_hits 0
STAT 10:cas_badval 0
STAT 10:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048176
END

3.2 調(diào)用memcached-tool dump數(shù)據(jù)

[root@hadoop1 scripts]# ./memcached-tool localhost:11211 dump |grep add |sort |head -n 10
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 100
Dumping bucket 10 - 100 total items
add lrutestkey_0000000000 0 1471173457 512
...

3.3 stats slabs監(jiān)控結(jié)果

[hadoop@hadoop1 ~]$ echo stats slabs  | nc 127.0.0.1 11211
STAT 10:chunk_size 696
STAT 10:chunks_per_page 1506
STAT 10:total_pages 1
STAT 10:total_chunks 1506
STAT 10:used_chunks 100
STAT 10:free_chunks 1406
STAT 10:free_chunks_end 0
STAT 10:mem_requested 58400
STAT 10:get_hits 100
STAT 10:cmd_set 100
STAT 10:delete_hits 0
STAT 10:incr_hits 0
STAT 10:decr_hits 0
STAT 10:cas_hits 0
STAT 10:cas_badval 0
STAT 10:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048176
END

結(jié)果

memcached-tool 引起了get_hits 的從原來(lái)的0變成100;由于,批量添加的100條數(shù)據(jù)值均是512字節(jié)長(zhǎng)度。 加上item的長(zhǎng)度32,等于544. 再加上key的長(zhǎng)度21, 一共是563.

所以會(huì)放到slab class  10() chunk size 696 ),而不是放到slab class   9(chunk size       552)。

3.4 memcached-tool監(jiān)控

3.4.1準(zhǔn)備測(cè)試數(shù)據(jù)

public void test111() throws ExecutionException, InterruptedException {
    final MemcachedClient mcc = MemcachedUtil.getSpyMemcachedClient();
   final Lock lock = new ReentrantLock();
  Thread t1=  new Thread(new Runnable() {
        @Override
        public void run() {
            for(int i=0;i<1000;i++){
            //    System.out.println("i="+i);
                try {
                    TimeUnit.MILLISECONDS.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String key = "lrutestkey_"+StringUtils.leftPad(""+i,10,"0");
                int size =new Random().nextInt(1000);
                String value = RandomStringUtils.randomAlphanumeric(size);
                mcc.set(key, 19000, value);
                System.out.println(key+"-->"+value);
            }
        }
    },"setting data");
          t1.start();
    t1.join();
    mcc.shutdown();
}

3.4.2 運(yùn)行memcached-tool命令

[hadoop@hadoop1 scripts]$ ./memcached-tool localhost:11211
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      80B        23s       1      10     yes        0        0    0
  2     104B        23s       1      26     yes        0        0    0
  3     136B        24s       1      30     yes        0        0    0
  4     176B        22s       1      37     yes        0        0    0
  5     224B        24s       1      47     yes        0        0    0
  6     280B        24s       1      50     yes        0        0    0
  7     352B        24s       1      72     yes        0        0    0
  8     440B        24s       1      93     yes        0        0    0
  9     552B        24s       1      91     yes        0        0    0
 10     696B        24s       1     142     yes        0        0    0
 11     872B        24s       1     174     yes        0        0    0
 12     1.1K        24s       1     228     yes        0        0    0
[hadoop@hadoop1 scripts]$ ./memcached-tool localhost:11211 display
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      80B       361s       1      10     yes        0        0    0
  2     104B       361s       1      26     yes        0        0    0
  3     136B       362s       1      30     yes        0        0    0
  4     176B       360s       1      37     yes        0        0    0
  5     224B       362s       1      47     yes        0        0    0
  6     280B       362s       1      50     yes        0        0    0
  7     352B       362s       1      72     yes        0        0    0
  8     440B       362s       1      93     yes        0        0    0
  9     552B       362s       1      91     yes        0        0    0
 10     696B       362s       1     142     yes        0        0    0
 11     872B       362s       1     174     yes        0        0    0
 12     1.1K       362s       1     228     yes        0        0    0

可以很清楚數(shù)據(jù)分布情況,把所有的Count列值求和,正好是1000.

當(dāng)然用 echo stats slabs  | nc 127.0.0.1 11211 |grep used_chunks命令也可以,片段如下

[hadoop@hadoop1 scripts]$ echo stats slabs  | nc 127.0.0.1 11211 |grep used_chunks
STAT 1:used_chunks 10
STAT 2:used_chunks 26
STAT 3:used_chunks 30
STAT 4:used_chunks 37
STAT 5:used_chunks 47
STAT 6:used_chunks 50
STAT 7:used_chunks 72
STAT 8:used_chunks 93
STAT 9:used_chunks 91
STAT 10:used_chunks 142
STAT 11:used_chunks 174
STAT 12:used_chunks 228

 ./memcached-tool localhost:11211 stats 與  echo stats   | nc 127.0.0.1 11211 |sort命令類似

memcached演練(5) 內(nèi)存管理

每個(gè)指標(biāo)的含義,網(wǎng)上資料有很多了,而且通過(guò)名稱也能猜出個(gè)所以然了。


4.驗(yàn)證一些邊界數(shù)據(jù)

1. 如果key超過(guò)250,報(bào)錯(cuò)信息

java.lang.IllegalArgumentException: Key is too long (maxlen = 250)

2. 可以往memcached存儲(chǔ)該對(duì)象。new byte[100*1024*1024]。明顯超過(guò)1M了,搞不太清楚。




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI