日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

单机 “5千万以上“ 工业级 LRU cache 实现

發(fā)布時(shí)間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单机 “5千万以上“ 工业级 LRU cache 实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 前言
    • 工業(yè)級(jí) LRU Cache
      • 1. 基本架構(gòu)
      • 2. 基本操作
        • 2.1 insert 操作
        • 2.2 高并發(fā)下 insert 的一致性/性能 保證
        • 2.3 Lookup操作
        • 2.4 shard 對(duì) cache Lookup 性能的影響
        • 2.4 Erase 操作
        • 2.5 內(nèi)存維護(hù)
      • 3. 優(yōu)化

前言

近期做了很多 Cache 優(yōu)化相關(guān)的事情,因?yàn)閷?duì)存儲(chǔ)引擎較為熟悉,所以深入研究了 Rocksdb 的Cache實(shí)現(xiàn),可以說(shuō)是樸實(shí)無(wú)華得展示了工業(yè)級(jí)Cache的細(xì)節(jié),非常精彩。

欣賞實(shí)現(xiàn)的同時(shí)做了一些簡(jiǎn)單的代碼驗(yàn)證,同時(shí)將整個(gè) Cache 的實(shí)現(xiàn)做了一番梳理,發(fā)現(xiàn)真實(shí)處處都是設(shè)計(jì),基本的算法實(shí)現(xiàn)只是最基礎(chǔ)的能力,如何設(shè)計(jì)實(shí)現(xiàn)的每一個(gè)細(xì)節(jié) 與 我們的cpu cacheline 運(yùn)行體系綁定,如何實(shí)現(xiàn)insert/lockup 鏈路中的無(wú)鎖,如何不影響性能的基礎(chǔ)上保持對(duì)Cache的內(nèi)存控制,如何讓頻繁的內(nèi)存分配和釋放不是cache的性能瓶頸… 等等都是需要非常多的設(shè)計(jì)。

本篇及下一篇將主體介紹兩種 Rocksdb 實(shí)現(xiàn)的高性能 工業(yè)級(jí) Cache中的LRUCache 和 ClockCache。
相關(guān)的Cache 實(shí)現(xiàn)代碼 以及 通用的cache_bench 工具 已經(jīng)單獨(dú)摘出來(lái),并在其上補(bǔ)充了一些更好展示cache內(nèi)部狀態(tài)的功能,代碼路徑:https://github.com/BaronStack/Cache_Bench。
編譯運(yùn)行:

# 1. 編譯
sh build.sh ; 
# 2. 執(zhí)行壓測(cè)
./cache_bench -threads=32 \
-lookup_percent=100 \
-erase_percent=0 \
-insert_percent=0 \
-num_shard_bits=10 \
-cache_size=2147483648 \
-use_clock_cache=false # 使用的是 LRU Cache# 3. 輸出
Number of threads   : 32
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 10
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 0%
Lookup percentage   : 100%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 0.670 s; QPS = 57348698

整體介紹整個(gè) Cache 體系實(shí)現(xiàn)之前,我們先思考一下我們的生產(chǎn)環(huán)境對(duì)Cache 的功能/性能 需求:

  1. Cache的讀性能至關(guān)重要,Cache的存在大多數(shù)是為了彌補(bǔ)我們熱點(diǎn) 低延時(shí)需求的場(chǎng)景下的高昂I/O代價(jià),所以高性能的讀 一定是必要的,良好的數(shù)據(jù)結(jié)構(gòu)的選型是關(guān)鍵,且要優(yōu)于從page-cache讀,不然我們干嘛需要單獨(dú)的cache,直接存在page-cache得了(不考慮內(nèi)存占用問題)。
  2. 高并發(fā)場(chǎng)景下需要保證Cache的可靠性。比如,我們多線程下insert的時(shí)候需要保證cache數(shù)據(jù)結(jié)構(gòu)更新的原子性。這里的更新包括insert/erase。所以在更新鏈路上可能需要加鎖,如何解決鎖引入的 CPU 上下文切換的代價(jià)?
  3. 友好的內(nèi)存控制功能。我們的線上機(jī)器往往不是一個(gè)服務(wù)在運(yùn)行,為了防止內(nèi)存無(wú)止境的消耗引發(fā)操作系統(tǒng)的OOM或者其他服務(wù)的swap ,則需要對(duì)當(dāng)前服務(wù)的Cache所占用的內(nèi)存進(jìn)行限制。這個(gè)時(shí)候,怎樣盡可能得保證可能得熱點(diǎn)長(zhǎng)期存在于Cache之中,則需要我們重點(diǎn)關(guān)注。
  4. 一些邊緣功能的實(shí)現(xiàn)。更高效的分配器選型,cache的insert/erase 會(huì)涉及到非常頻繁的內(nèi)存操作,如何保證在復(fù)雜的workload場(chǎng)景(key-value大小差異非常大,幾個(gè)byte 到 幾 M;頻繁的插入和Erase)能夠?qū)ache拿到的內(nèi)存有一個(gè)高效的管理,在對(duì)分配器底層有足夠了解的情況下 選擇合適的分配器能夠起到加速cache使用 的作用。

綜合來(lái)看,一個(gè)工業(yè)級(jí)高效Cache的實(shí)現(xiàn)是需要 深入理解數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)的CPU子系統(tǒng)、內(nèi)存子系統(tǒng)的實(shí)現(xiàn) 才能保證最終的產(chǎn)出是高效合理 滿足工業(yè)級(jí)需求的。

限于作者能力有限,希望能在有限的能力基礎(chǔ)上為大家展示更多的實(shí)現(xiàn)細(xì)節(jié),一起品鑒,如有不足,麻煩一定指正。

工業(yè)級(jí) LRU Cache

介紹 Rocksdb 對(duì)LRU cache的改造之前,先概覽一下 LRU cache,顧名思義,LRU(Least recently used),近期使用最少的緩存單元將會(huì)被優(yōu)先淘汰。
關(guān)于LRU的基本算法實(shí)現(xiàn),網(wǎng)上介紹的太多了,基礎(chǔ)的鏈表就能夠滿足針對(duì)LRU的插入/刪除/查找了,這里就不做過多的展開了。我們直接進(jìn)入正題,也就是Rocksdb 的LRU Cache如何在滿足以上那幾個(gè)需求的過程中針對(duì)LRU 做了哪一些改造。

1. 基本架構(gòu)

先看一下整體的LRU Cache的架構(gòu):

是不是看起來(lái)和 基本的LRU 實(shí)現(xiàn)有很大的差異,先整體介紹一下整個(gè)架構(gòu)中每一個(gè)組件的作用,后續(xù)將詳細(xì)介紹這幾個(gè)組件是為了解決需求中的什么問題而引入的:

  1. shard。 我們可以看到,整個(gè)LRU cahce 從外部來(lái)看是一個(gè)個(gè)分開的shard,每一個(gè)shard內(nèi)部才是真正的lru cache的底層實(shí)現(xiàn)。上層的用戶請(qǐng)求 在進(jìn)入cache操作之前 會(huì)先經(jīng)過hash映射到預(yù)先創(chuàng)建好的一個(gè)個(gè)shard中,然后才是針對(duì)每個(gè)cache內(nèi)部的操作。
  2. HashTable。 這個(gè)組件是為了加速shard內(nèi)部 lru cache查找的,將要操作的key進(jìn)行hash生成唯一的一個(gè)hash值,這個(gè)key的操作將落在某一個(gè)hash-bucket之中,通過單鏈表來(lái)解決hash沖突。每次針對(duì)hash表的鏈表插入都會(huì)采用頭插法,保證越新的key將采越靠近bucket頭部。
  3. High pri pool / Low pri pool。高優(yōu)先級(jí)緩存池和低優(yōu)先級(jí)緩存池 是主體的Cache部分,也就是 LRU 維護(hù)數(shù)據(jù)的主體部分。lru_是高優(yōu)先級(jí)pool的head,也是整個(gè)cache的head,所有高優(yōu)先級(jí)的entry的插入都先插入到lru頭部。low-pri 是低優(yōu)先級(jí)pool的尾部,所有針對(duì)低優(yōu)先級(jí)pool的更新也都會(huì)插入到low-pri的尾部。從上圖可以看到,高優(yōu)先級(jí)pool的尾部和低優(yōu)先級(jí)pool的尾部相接,這樣從整個(gè)lru_鏈表來(lái)看,lru的prev就是整個(gè)lru-cache的最新的元素,lrv的next就是lru-cache的最舊的元素。

2. 基本操作

針對(duì)Cache的幾個(gè)基本操作包括如下幾種:

 virtual bool Insert(const Slice& key, uint32_t hash, void* value,size_t charge,void (*deleter)(const Slice& key, void* value),Cache::Handle** handle,Cache::Priority priority) override;virtual Cache::Handle* Lookup(const Slice& key, uint32_t hash) override;virtual bool Ref(Cache::Handle* handle) override;virtual bool Release(Cache::Handle* handle,bool force_erase = false) override;virtual void Erase(const Slice& key, uint32_t hash) override;

更細(xì)粒度的一些數(shù)據(jù)結(jié)構(gòu)的指標(biāo)如下,能夠直接將Cache 擁有的內(nèi)部結(jié)構(gòu)暴漏出來(lái):
每一個(gè)cache entry 維護(hù)了一個(gè) LRUHandle,可以看作是用來(lái)標(biāo)識(shí)一個(gè)key-value

struct LRUHandle {void* value; void (*deleter)(const Slice&, void* value);LRUHandle* next_hash;LRUHandle* next;LRUHandle* prev;size_t charge;  // TODO(opt): Only allow uint32_t?size_t key_length;// The hash of key(). Used for fast sharding and comparisons.uint32_t hash;// The number of external refs to this entry. The cache itself is not counted.uint32_t refs;enum Flags : uint8_t {// Whether this entry is referenced by the hash table.IN_CACHE = (1 << 0),// Whether this entry is high priority entry.IS_HIGH_PRI = (1 << 1),// Whether this entry is in high-pri pool.IN_HIGH_PRI_POOL = (1 << 2),// Wwhether this entry has had any lookups (hits).HAS_HIT = (1 << 3),};uint8_t flags;char key_data[1];

其中 主體部分包括:

  1. key_data: 實(shí)際插入的key數(shù)據(jù)部分
  2. value: 實(shí)際的value數(shù)據(jù)
  3. deleter ,是一個(gè)回調(diào)函數(shù),用來(lái)清理ref=0, in-cache=false的key-value
  4. next_hash,是hashtable 中解決hash沖突的單鏈表
  5. next/prev: hpri, lrpi 中的雙向鏈表
  6. charge,表示當(dāng)前handle的大小
  7. hash,當(dāng)前key的hash值,主要被用做hash-table/ high/low pool 中的key的查找,用來(lái)標(biāo)識(shí)唯一key
  8. refs, key被引用的次數(shù)
  9. flags, 其四個(gè)字節(jié)分別被枚舉類型 Flags 中的四個(gè)標(biāo)識(shí)來(lái)用。這四個(gè)標(biāo)識(shí),將用來(lái)決定一個(gè) LRUHandle 應(yīng)該存儲(chǔ)于哪里。

前面提到我們的shard cache 為了加速查找性能,引入了 hashtable, 基本的table 數(shù)據(jù)結(jié)構(gòu)可以參考LRUHandleTable

每一個(gè) shard 則維護(hù)了這個(gè) Cache 的內(nèi)部信息,通過如下數(shù)據(jù)結(jié)構(gòu)能夠更直觀得看到 Cache 的內(nèi)部情況。

  // Initialized before use.size_t capacity_;......LRUHandle lru_;LRUHandle* lru_low_pri_;LRUHandleTable table_;size_t usage_;size_t lru_usage_;......
};
  1. capacity。 當(dāng)前shard的初始容量,我們外部配置的LRU cache大小會(huì)被均分到多個(gè)cache shard中
  2. lru_。高優(yōu)先級(jí)pool的雙向循環(huán)鏈表的表頭,也是整個(gè)lru 鏈表的表頭。
  3. lru_low_pri。低優(yōu)先級(jí)pool,總是指向低優(yōu)先級(jí)pool的鏈表頭。
  4. table_。 hashtable 。
  5. usage_。整個(gè)shard 當(dāng)前的使用總?cè)萘?#xff0c;包含lru_usage_的容量。
  6. lru_usage_。兩個(gè)pool中的鏈表使用容量。

大體的shard 以及 shard內(nèi)部數(shù)據(jù)結(jié)構(gòu)就介紹這么多,下來(lái)我們從一些基礎(chǔ)的操作來(lái)看看整個(gè) shard 內(nèi)部的狀態(tài)。

2.1 insert 操作

了解LRU Cache最直接的辦法就是從Insert 中來(lái)看,insert 會(huì)涉及針對(duì)每一個(gè)組件的操作,同時(shí)會(huì)夾雜著cache 滿之后的數(shù)據(jù)淘汰過程,這也是Cache的算法基礎(chǔ)體現(xiàn)。

最開始的Cache中沒有任何數(shù)據(jù),我們初始化cache的一些配置如下:

ps: 這里的capacity實(shí)際是當(dāng)前shard cache的大小,單位是bytes, 這里的5 是為了后續(xù)說(shuō)明整個(gè)插入過程而用一種有歧義的方式來(lái)表示,可以看作是當(dāng)前shard中能夠保存多少個(gè)key-value的entry個(gè)數(shù)。

那么初始化之后的cache 情況如下:

  1. hashtable 只有在有key的時(shí)候才會(huì)動(dòng)態(tài)初始化填充。
  2. high pri pool 根據(jù)初始時(shí)設(shè)置的cache 比例,將會(huì)初始化為capacity 為 4,且對(duì)雙向循環(huán)鏈表進(jìn)行初始化。
  3. low pri pool 則直接取 high 剩下的容量。

當(dāng)我們插入一條enry的時(shí)候,經(jīng)過對(duì)key的hash 可以知道這個(gè)key將落在哪一個(gè)shard,后續(xù)的操作都將針對(duì)這個(gè)shard來(lái)進(jìn)行,接下來(lái)我們看看一條 key 在shard cache內(nèi)部 的數(shù)據(jù)流:
第一次插入的時(shí)候需會(huì)同步在hashtable 和 high-pool和之中,同時(shí)設(shè)置count 為0.

high pool 有充足的容量之前的插入都會(huì)先插入到highpool之中,如果high pool滿了,會(huì)將high pool中最舊的數(shù)據(jù)淘汰到low pool之中。


則在shard cache中的插入過程如下:

key在選擇指定shard 操作之前會(huì)做一次hash, 帶著這個(gè)hash值操作接下來(lái)的shard。

  1. 首先是更新hashtable,拿著這個(gè)hash值通過 hash & (length_ - 1) 選擇對(duì)應(yīng)的hash-bucket,并采用頭插法插入到這個(gè)bucket后的單鏈表中。
  2. 其次更新high pool 或者 low pool。判斷初始參數(shù)設(shè)置的high pool的比例是否大于0,以及當(dāng)前pool 是否未滿,如果是則優(yōu)先更新high pool,否則更新low pool。所以會(huì)先采用頭插法,插入到lru_頭部(高優(yōu)先級(jí) pool)。

第二次的插入也是類似的。

后續(xù)的插入針對(duì)hash-table 的更新 以及 lru_ 鏈表的更新都是采用頭插法。
當(dāng)high pool 插滿之后,則需要將high pool最舊的元素插入到 low pool之中,這個(gè)時(shí)候就需要將low_pri的指針放在high pool的末尾了。

Ban 這個(gè)字符串需要插入到high pool的時(shí)候發(fā)現(xiàn)滿了,插入還是會(huì)先插入到high pool的頭部,但是low-pri指針需要需要向后移動(dòng)一次,low-pri的next 直接指向的是high pool的末尾元素。
此時(shí),在high-pool之中,頭指針的lru_.prev指向的是最新的key,lru_.next指向的是最舊的key。

此時(shí)我們可以看到當(dāng)前的shard-cache已經(jīng)滿了,那后續(xù)的insert將是什么樣的行為呢,再插入一條key看看。

主體主要是兩個(gè)步驟:

  1. 嘗試插入新的key Ted之前,會(huì)先檢測(cè)插入后的容量是否超過capacity。這里顯然是超過了,會(huì)出發(fā)cache evict,即從cache中移除最舊的一條key,顯然就是lru.next指向的 abc了。現(xiàn)將abc 從hashtable 中移除,同時(shí)在其ref count為0的時(shí)候從lru-list中移除。
  2. 將新的keyTed按照之前的方式插入到 hash-table 和 lru-list之中,并將high pool的最舊的key hsd放在low-pool之中。

到此,基本的插入過程就已經(jīng)很清晰了,我們能夠看到high-pool的頭插法 + low-pool 的尾插法 是能夠完整的維護(hù)LRU Cache的特性。
可以看到,高低優(yōu)先級(jí) pool的功能,是為了盡可能得讓熱點(diǎn)key在cache中駐留的時(shí)間最長(zhǎng)。而hashtable 的能力則是一個(gè)cache-key的全集,能夠在需要lookup的時(shí)候以最快的速度找到目標(biāo)key。

2.2 高并發(fā)下 insert 的一致性/性能 保證

這個(gè)時(shí)候,我們?cè)倩仡^看看我們的工業(yè)級(jí)需求。
可以看到Insert的過程涉及大量的指針更新(針對(duì)high/low/hashtable),所以針對(duì)同一個(gè)shard-cache的更新,如果我們不想出現(xiàn)指針指向的丟失或者指向錯(cuò)誤,那就需要保證每一次更新的原子性了,那就需要引入鎖機(jī)制了。
但是這個(gè)鎖不應(yīng)該影響整個(gè)shard的其他讀取/更新操作,只需要保證當(dāng)前handle的更新是一個(gè)排他鎖,所以LRU-Cache的更新鎖粒度是 key。鎖的范圍是 從 key 在 hashtable 中的更新到 key在lru-list 中的更新。

這把鎖鎖住了當(dāng)前CPU 多次訪存操作,而在高并發(fā)的cahce更新場(chǎng)景性能將非常難看,使用我們的cache-bench 做如下幾個(gè)測(cè)試。

# 單shard 單線程的 純 insert./cache_bench -threads=1 -lookup_percent=0 -erase_percent=0 -insert_percent=100 -num_shard_bits=0 -cache_size=2147483648 -use_clock_cache=false
Number of threads   : 1
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 0
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 100%
Lookup percentage   : 0%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 0.919 s; QPS = 1306012# 單shard 16線程的 純 insert
./cache_bench -threads=16 -lookup_percent=0 -erase_percent=0 -insert_percent=100 -num_shard_bits=0 -cache_size=2147483648 -use_clock_cache=false                                                                                                       
Number of threads   : 16
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 0
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 100%
Lookup percentage   : 0%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 38.139 s; QPS = 503421

可以看到如果我們只維護(hù)一個(gè)整體的cache,那在這種高并發(fā)場(chǎng)景下的性能將巨差,從單線程的130w 降到 16線程的 50w,因?yàn)獒槍?duì)一個(gè)cache - shard 的原子更新讓多核場(chǎng)景的cpu根本無(wú)法發(fā)揮用處,性能顯然會(huì)很差。

雖然鎖 保證了多線程下的Cache一致性, 但是高并發(fā)場(chǎng)景的性能是用戶所不能接受的。而為了提升多核硬件中高并發(fā)下的性能,cache的分shard策略是必然的。
如下測(cè)試,多shard的多線程顯然比單shard 好很多,而這一點(diǎn)在cache的lookup heavy場(chǎng)景體現(xiàn)的更加明顯,后面有詳細(xì)的測(cè)試數(shù)據(jù)。

./cache_bench -threads=16 -lookup_percent=0 -erase_percent=0 -insert_percent=100 -num_shard_bits=5 -cache_size=2147483648 -use_clock_cache=false
Number of threads   : 16
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 5
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 100%
Lookup percentage   : 0%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 7.874 s; QPS = 2438406

2.3 Lookup操作

那我們繼續(xù)。
接下來(lái)看看 LRU 的查找操作,查找很簡(jiǎn)單。
查找的大體過程如下:

  1. 先從hashtable 中查找,如果找不到直接返回。
  2. 找到了,拿著找到的handle 返回即可。
  3. 同時(shí),為了提升lookup 命中cache的key的熱度,會(huì)標(biāo)記當(dāng)前key為命中。再次insert 當(dāng)前key時(shí),則會(huì)直接放在高優(yōu)先級(jí)的pool中。
  4. 判斷其ref是否為0,如果是會(huì)將其從lru鏈表中移除,但因?yàn)樗徊檎疫^,所以還會(huì)在hashtable中保留一份它的key-handle。



如果ref count 為0 時(shí),對(duì)于Cache來(lái)說(shuō)再次進(jìn)行操作就可以進(jìn)行清理了,因?yàn)?目的是為了讓熱點(diǎn)key長(zhǎng)期駐留在cache中。而lookup則表明這個(gè)key是一個(gè)熱點(diǎn)key,所以會(huì)將其保留在HashTable中,因?yàn)橹暗膔ef count 為0,則會(huì)從LRU 中移除,但是會(huì)標(biāo)記hit,在后續(xù)的insert 操作則會(huì)再次添加到lru-cache的high-pool中。

所以,Lookup操作也會(huì)有指針的更新,也就需要鎖的保護(hù)了。

Cache::Handle* LRUCacheShard::Lookup(const Slice& key, uint32_t hash) {MutexLock l(&mutex_);LRUHandle* e = table_.Lookup(key, hash);if (e != nullptr) {assert(e->InCache());if (!e->HasRefs()) {// The entry is in LRU since it's in hash and has no external references// LRU 雙向鏈表中的移除操作。LRU_Remove(e);}e->Ref();e->SetHit();}return reinterpret_cast<Cache::Handle*>(e);
}

所以,因?yàn)楣I(yè)級(jí)cache對(duì)一致性的需求引入了鎖,那我們想要提升性能,分shard仍然有很大的需求了,對(duì)于shard來(lái)說(shuō) 無(wú)非引入了一點(diǎn)內(nèi)存管理的代價(jià)而已,性能上key的按hash映射是位運(yùn)算,可能就幾個(gè)ns,根本沒有什么消耗。

2.4 shard 對(duì) cache Lookup 性能的影響

我們來(lái)測(cè)試一下Lookup性能,保持80% 的lookup和20% 的insert,分別看一下單shard下單線程和多線程的性能 已經(jīng) 多shard下的多線程性能。

# 單線程 單sharda
./cache_bench -threads=1 -lookup_percent=80 -erase_percent=0 -insert_percent=20 -num_shard_bits=0 -cache_size=2147483648 -use_clock_cache=false
Number of threads   : 1
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 0
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 20%
Lookup percentage   : 80%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 0.273 s; QPS = 4398988# 多線程 單shard
./cache_bench -threads=16 -lookup_percent=80 -erase_percent=0 -insert_percent=20 -num_shard_bits=0 -cache_size=2147483648 -use_clock_cache=false
Number of threads   : 16
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 0
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 20%
Lookup percentage   : 80%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 18.037 s; QPS = 1064451

可以看到,單shard下的單線程有440w /s 的吞吐,而 多線程僅有106w。
再跑一下多shard的場(chǎng)景,我們跑了1024個(gè)shard,可以看到性能能夠達(dá)到 1950w/s (在lookup 比例更高一些的場(chǎng)景,隨著shard個(gè)數(shù)的增加,性能甚至能夠達(dá)到線性,當(dāng)然實(shí)際shard個(gè)數(shù)大于2^20 的時(shí)候性能就開始退化了)。

./cache_bench -threads=16 -lookup_percent=80 -erase_percent=0 -insert_percent=20 -num_shard_bits=10 -cache_size=2147483648 -use_clock_cache=false
Number of threads   : 16
Ops per thread      : 1200000
Cache size          : 2147483648
Num shard bits      : 10
Max key             : 1073741824
Populate cache      : 0
Insert percentage   : 20%
Lookup percentage   : 80%
Erase percentage    : 0%
Test count          : 1
----------------------------
1 Test: complete in 0.984 s; QPS = 19504108

所以LRU cache 之上的shard 封裝,真的可以說(shuō)是工業(yè)級(jí)高并發(fā)cache上 設(shè)計(jì)層面的一個(gè) 必備能力了。

2.4 Erase 操作

后面的 Erase操作這里便不再多說(shuō)了,和lookup的操作時(shí)類似的。優(yōu)先從hashtable中清理,如果key-handle的引用計(jì)數(shù)為0,則會(huì)從 high/low pool中的cache中移除,同樣因?yàn)樵O(shè)計(jì)cache的更新,所以還是有鎖的參與來(lái)原子更新cache的雙向鏈表。

void LRUCacheShard::Erase(const Slice& key, uint32_t hash) {LRUHandle* e;bool last_reference = false;{MutexLock l(&mutex_);e = table_.Remove(key, hash);if (e != nullptr) {assert(e->InCache());e->SetInCache(false);if (!e->HasRefs()) {// The entry is in LRU since it's in hash and has no external referencesLRU_Remove(e);usage_ -= e->charge;last_reference = true;}}}// Free the entry here outside of mutex for performance reasons// last_reference will only be true if e != nullptrif (last_reference) {e->Free();}
}

2.5 內(nèi)存維護(hù)

  1. 外部設(shè)置的Cache大小會(huì)被均分給設(shè)置的多個(gè)shard。
    LRUCache::LRUCache(size_t capacity, int num_shard_bits,bool strict_capacity_limit, double high_pri_pool_ratio,std::shared_ptr<MemoryAllocator> allocator,bool use_adaptive_mutex)
    : ShardedCache(capacity, num_shard_bits, strict_capacity_limit,std::move(allocator)) {// 2^num_shard_bits 個(gè) shardnum_shards_ = 1 << num_shard_bits;shards_ = reinterpret_cast<LRUCacheShard*>(port::cacheline_aligned_alloc(sizeof(LRUCacheShard) * num_shards_));// 均分的總cache大小size_t per_shard = (capacity + (num_shards_ - 1)) / num_shards_;for (int i = 0; i < num_shards_; i++) {new (&shards_[i])LRUCacheShard(per_shard, strict_capacity_limit, high_pri_pool_ratio,use_adaptive_mutex);}
    }
    
  2. 每個(gè)Cache內(nèi)部,Lru high/low pool的總內(nèi)存大小 lru_usge_ 是包含在 hashtable 的內(nèi)存占用總大小usage之內(nèi)的。
    hashtable的usage 是每一個(gè)handle 都要進(jìn)行更新的,insert/erase 都需要操作hashtable。

如果想要看到更細(xì)粒度的cache內(nèi)部狀態(tài),則可以通過如下命令
編譯運(yùn)行的話進(jìn)入到cd example; make test即可,會(huì)詳細(xì)得打印每個(gè)shard cache內(nèi)部hashtable , lru 雙向鏈表的狀態(tài)。

3. 優(yōu)化

通過以上的一些實(shí)現(xiàn)架構(gòu)和細(xì)節(jié)上的描述,我們能夠總結(jié)出 rocksdb 的工業(yè)級(jí)lru cache 相比于傳統(tǒng)lru-cache 的優(yōu)化點(diǎn):

  1. 多次提到過的 并且在性能測(cè)試中性能突出的 分shard能力。
  2. 為了保證Cache一致性的操作鎖。
  3. 為了提升Cache 讀性能的hashtable 以及 高低優(yōu)先級(jí)pool,hash table用來(lái)加速key的查找,并且盡可能得保證熱點(diǎn)key保存在了 內(nèi)存中。
  4. 支持指定不同的分配器來(lái)作為L(zhǎng)RUCache的默認(rèn)分配器。(本篇沒有對(duì)不同分配器的性能進(jìn)行測(cè)試,直接使用的是操作系統(tǒng)默認(rèn)的malloc/free)
  5. 內(nèi)存控制管理能力,超過限制,則按照LRU策略從優(yōu)先從low pool中淘汰數(shù)據(jù)(其本身也是整個(gè)LRU Cache中較舊的數(shù)據(jù),其頭部則是整個(gè)lru 雙向鏈表最舊的數(shù)據(jù))。

相關(guān)代碼 和 benchmark 工具 :https://github.com/BaronStack/Cache_Bench

這個(gè)LRU Cache是作為Rocksdb的默認(rèn)cache,同時(shí)Rocksdb還提供了另外一種可選的Cache : ClockCache。因?yàn)樗x用了tbb:concurrent_hash_map 作為索引,底層選擇deque 作為clock algorighm的實(shí)現(xiàn)。因?yàn)門BB 庫(kù)本身的無(wú)鎖操作,從而在Cache的并發(fā)操作上有了不小的提升。

限于篇幅原因,ClockCache的介紹會(huì)單獨(dú)進(jìn)行,包括基本的架構(gòu)設(shè)計(jì) 以及 tbb 的 無(wú)鎖化(并發(fā)erase) 實(shí)現(xiàn)細(xì)節(jié)。

總結(jié)

以上是生活随笔為你收集整理的单机 “5千万以上“ 工业级 LRU cache 实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日本黄色免费播放 | 四虎视频| 丁香视频五月 | 精品国产电影一区二区 | 在线观看亚洲电影 | 中文字幕在线影视资源 | 开心激情五月婷婷 | 美女视频黄免费的久久 | 91高清在线 | 国产精品video爽爽爽爽 | 国产五月婷 | 婷婷六月丁 | 亚洲成av人片在线观看无 | 婷婷色视频 | 国产在线视频资源 | 午夜精品一区二区三区在线视频 | 看国产黄色大片 | 97超碰色偷偷 | 天堂av在线免费 | 欧美一区二区精美视频 | 精品一区二区三区香蕉蜜桃 | 久久精品国产一区二区电影 | 黄色一级动作片 | 亚洲精品综合一区二区 | 亚洲aaa级 | 成 人 黄 色 片 在线播放 | 二区中文字幕 | 国产日本亚洲高清 | 亚洲综合精品视频 | 国产免费又爽又刺激在线观看 | 日韩精品免费一区 | www.一区二区三区 | 国产亚洲精品无 | 国产精品99久久久久久小说 | 中文字幕一区二区三区久久蜜桃 | 欧美福利久久 | 久久理论影院 | 黄色av一区 | 久久久久免费看 | 在线亚洲高清视频 | 免费看的黄色小视频 | 正在播放一区二区 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产成人精品久久久久蜜臀 | 日本性生活一级片 | 亚洲在线精品 | 在线观看91精品视频 | 99热在线看 | 中文字幕在线视频第一页 | 日韩精品一区二区三区免费观看 | 亚洲精品日韩在线观看 | 日日摸日日 | 国产自在线观看 | 国产在线精品一区 | 国产精品麻豆果冻传媒在线播放 | 欧美一区二区在线免费看 | 91一区一区三区 | 日日摸日日添日日躁av | 精品久久网 | 五月婷婷色丁香 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 久久午夜国产精品 | 亚洲一级电影视频 | 久久黄色成人 | 欧美日韩电影在线播放 | 色婷婷视频网 | 51精品国自产在线 | 国产日韩欧美在线看 | 黄色电影在线免费观看 | 免费a视频在线观看 | 国产精品免费不卡 | 婷婷av网| 亚洲aⅴ在线 | 人人超在线公开视频 | 97超碰人人澡| 天天干夜夜爱 | 久草视频网| 国产视频二 | 久久公开免费视频 | 中文字幕亚洲情99在线 | 婷婷丁香激情五月 | www亚洲国产| 久久人人爽人人爽人人片av软件 | 97精品免费视频 | 成人h视频在线播放 | 午夜av色 | av在线免费观看网站 | 亚洲午夜久久久综合37日本 | 成人国产综合 | 久久 亚洲视频 | 久久久久国产精品免费网站 | 在线观看香蕉视频 | 毛片的网址 | 看毛片的网址 | 午夜资源站 | 碰超在线 | 丁香激情综合久久伊人久久 | 欧美极品在线播放 | 一区二区视| 在线看不卡av | 色婷婷a| 日韩高清精品免费观看 | 亚洲精品国内 | 亚洲电影一级黄 | 亚洲精品av中文字幕在线在线 | 91自拍视频在线 | 成年人视频在线观看免费 | 最近的中文字幕大全免费版 | 免费视频18| 午夜精品久久久 | 最近日本中文字幕 | 国产日韩精品在线观看 | 大型av综合网站 | 在线精品观看国产 | 五月天综合在线 | 成人黄色影片在线 | 日韩av影片在线观看 | 91视频高清免费 | 91色一区二区三区 | 精品久久久久久久久久 | 91av小视频 | 伊人久久电影网 | 国产亚洲精品美女 | 91精品网站在线观看 | 97狠狠干| 国产亚洲精品综合一区91 | 伊人激情网 | 午夜视频一区二区 | 久久91久久久久麻豆精品 | 亚洲精品九九 | 成人免费xxxxxx视频 | 久草a在线| 国产一区二区影院 | 婷婷在线色 | 中文字幕一区二区三区乱码不卡 | 少妇视频一区 | 一色屋精品视频在线观看 | av高清一区 | 国产欧美日韩视频 | 1区2区视频 | 伊人影院av | 色婷婷综合久久久中文字幕 | 欧美一区二区免费在线观看 | 中文av免费| 婷婷激情五月综合 | 亚洲电影影音先锋 | 免费看黄色毛片 | 蜜臀久久99静品久久久久久 | ww亚洲ww亚在线观看 | 国产资源免费在线观看 | 在线观看播放av | av在线等 | 久久99国产精品 | 日韩激情影院 | 干天天| 国产黄色精品网站 | 99久久99久国产黄毛片 | 成人av电影免费在线观看 | 国产精品免费观看国产网曝瓜 | 国产色在线 | 欧美一区二区在线免费观看 | 天天碰天天操 | 超碰日韩 | 精品免费观看 | 日韩av图片 | 狠狠狠狠狠狠狠 | 四虎影视4hu4虎成人 | 五月激情片 | 九九热国产 | 日韩欧美精品一区 | 日韩毛片精品 | 久久久三级视频 | 天天综合入口 | 久久久av电影| 亚洲在线免费视频 | 草久久av| 久久久99精品免费观看 | se视频网址| 综合伊人久久 | 欧美一二三区播放 | 色偷偷888欧美精品久久久 | 国产精品原创 | 婷婷狠狠操 | 日韩一二区在线 | 成人午夜免费剧场 | 色干干| 国产成人福利在线观看 | 久久久久激情电影 | 日韩中文在线字幕 | 久久免费视频一区 | 国产高清视频免费观看 | 日韩高清黄色 | 久久亚洲婷婷 | 99r在线精品 | 毛片的网址 | 婷婷中文字幕在线观看 | 国产精品人人做人人爽人人添 | 女人高潮一级片 | 亚洲91av| 丁香六月婷婷激情 | 激情综合一区 | 欧美日韩一区二区三区在线免费观看 | 免费av高清| 97超碰在线免费 | 偷拍福利视频一区二区三区 | 国产免费高清视频 | 二区三区在线视频 | 日本精品久久久久影院 | 国产丝袜美腿在线 | 人人草在线视频 | 女女av在线 | 欧美福利片在线观看 | 午夜国产福利在线 | 国产精品久久久久久久7电影 | 人人插人人做 | 国内精品亚洲 | 青春草免费视频 | 一级黄色毛片 | 久久综合桃花 | 五月开心激情 | 精品亚洲在线 | 欧美色就是色 | 狠狠干婷婷 | 久久不色 | aaa毛片视频 | 不卡av在线 | 久草视频资源 | 91黄站| 天天撸夜夜操 | 亚洲精品视频在线观看免费视频 | 日日添夜夜添 | 久草视频看看 | 综合婷婷 | 欧美日韩国产网站 | www.夜夜爱| 久久99视频免费 | 少妇精品久久久一区二区免费 | 欧美尹人 | 色爱区综合激月婷婷 | 丁香五月缴情综合网 | 在线观看91av | 国产 一区二区三区 在线 | av成人在线网站 | 国产在线精品区 | 日韩在线观看视频在线 | 国产一线天在线观看 | 亚洲精品成人在线 | 日本在线中文在线 | 久久久久久久久久久久影院 | 不卡精品视频 | 一区二区三区四区免费视频 | 亚洲精品国产精品国自 | 97av视频| 欧美日韩不卡一区二区三区 | 日韩欧美综合精品 | 精品国产免费观看 | 中文字幕日韩在线播放 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 少妇性色午夜淫片aaaze | 国产精品久久久久久久久久三级 | 三上悠亚一区二区在线观看 | 丁香在线视频 | 高清国产午夜精品久久久久久 | 国产精品乱码久久 | 一区二区三区日韩在线观看 | 亚洲aⅴ一区二区三区 | 精品免费在线视频 | 91成人精品 | 久久综合五月天婷婷伊人 | 国产主播大尺度精品福利免费 | 日日夜夜精品免费 | 亚洲欧洲精品视频 | 久久调教视频 | 久久99精品国产麻豆宅宅 | 色婷婷九月 | 精品在线观看一区二区三区 | 亚洲人人精品 | 热99在线 | 黄色小说免费在线观看 | 噜噜色官网 | 97国产电影 | 91九色porny蝌蚪视频 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 99精品热视频只有精品10 | 亚洲情影院 | 成人av中文字幕在线观看 | 久草电影在线观看 | 成人va视频| 免费99视频 | 中文字幕资源网在线观看 | 久久久久久高潮国产精品视 | www.夜夜草| 日韩av成人免费看 | 久久精品激情 | 99在线视频免费观看 | 国产日韩精品久久 | 免费一级片在线观看 | 久久久久国产精品午夜一区 | 婷婷在线不卡 | 在线观看黄av | 最新国产在线视频 | 热re99久久精品国产66热 | www.夜夜爱| 日韩经典一区二区三区 | 一级电影免费在线观看 | 综合色站| 久久久久久久影视 | 欧美 激情 国产 91 在线 | 天天干天天操天天做 | 日韩综合在线观看 | 久久久久久久久久网 | 精品美女视频 | 欧美一二三专区 | 美女免费视频黄 | 99久久久成人国产精品 | 久久精品黄| 国产精品久久久久久久久久免费 | 久久久免费观看完整版 | 亚洲电影黄色 | 日日日操操| 特及黄色片| 欧美极品裸体 | 中日韩三级视频 | 超碰成人网| 国产精品一区二区在线观看 | 久久涩视频 | 亚洲午夜久久久综合37日本 | 蜜臀aⅴ国产精品久久久国产 | 日本黄色免费大片 | 国产一级电影网 | 又黄又网站 | 人人草网站 | 日韩视频一区二区三区 | 999久久精品 | 中文字幕成人av | 最近中文字幕 | 久久99国产精品 | 欧美另类亚洲 | 91一区二区三区久久久久国产乱 | 中文字幕亚洲欧美日韩 | 国产精品视频免费 | 国产精品久久久久久久久久久免费看 | 99热最新网址 | 色多多视频在线 | 亚洲草视频 | 一级淫片在线观看 | 超碰97国产精品人人cao | 久久免费一级片 | 日韩久久久久久久久久 | www.久久成人 | 久久不卡国产精品一区二区 | 中文字幕av全部资源www中文字幕在线观看 | 亚洲a网| 日韩在线免费观看视频 | 中文字幕专区高清在线观看 | 国产精品大片免费观看 | 午夜骚影| 黄色片网站免费 | 中文字幕第一页在线视频 | 欧美性性网 | 探花视频在线观看免费版 | 免费观看国产精品视频 | 综合色站导航 | 在线精品国产 | 国语久久 | 美女网站一区 | 91av99| 欧美色黄 | 探花视频免费在线观看 | 99精品免费久久久久久久久 | 日韩精品在线视频 | 国产麻豆剧果冻传媒视频播放量 | 日韩在线高清 | 亚洲午夜精品一区二区三区电影院 | 日韩欧美网站 | 97超碰福利久久精品 | 国产精品男女啪啪 | 综合精品在线 | 日本精品久久 | 婷婷日| 免费在线观看av片 | 97人人爽人人 | 久久爽久久爽久久av东京爽 | 国内精品久久久久久久影视简单 | 精品亚洲免a | 国产一级视频在线免费观看 | 丁香久久激情 | 久久免费在线视频 | 在线观看av网站 | 婷婷激情综合 | 久久一级片| 99超碰在线观看 | 综合网天天射 | 精品国模一区二区三区 | 又污又黄的网站 | 日韩欧美有码在线 | 99久久国产免费,99久久国产免费大片 | 色综合久久天天 | 亚洲九九 | 女人18毛片a级毛片一区二区 | 97福利社| 亚洲精品日韩av | 日韩欧美视频在线观看免费 | 极品中文字幕 | 成人免费视频在线观看 | 久久一区国产 | 中文字幕av全部资源www中文字幕在线观看 | 日韩精品免费在线 | 日本成人中文字幕在线观看 | 亚洲国产成人高清精品 | 91亚洲精品在线观看 | 九九在线视频 | 久久五月婷婷综合 | 国产精彩在线视频 | 91人人插| 日韩精品一区二区三区高清免费 | av国产在线观看 | 久久久影院一区二区三区 | 国产专区一 | 91视频-88av | 在线观看午夜av | 丁香激情婷婷 | 精品在线二区 | 亚洲成熟女人毛片在线 | 国产成人一区二区三区在线观看 | 国产在线播放观看 | 亚洲精品a区| 丁香六月婷婷 | 日本中文字幕网址 | 91天天视频 | 99看视频在线观看 | 毛片精品免费在线观看 | 久久久国产精品人人片99精片欧美一 | 超碰在线人人爱 | 99色资源| 亚洲电影自拍 | 欧美精品被 | 在线视频观看成人 | 午夜影院一级 | 欧美日韩有码 | 欧美一级片免费在线观看 | 亚洲一区尤物 | 玖玖玖在线观看 | 成年人在线电影 | 久久r精品 | 久久这里精品视频 | www国产精品com | 最近免费中文字幕大全高清10 | 91porny九色在线播放 | 成人蜜桃网 | 91av视频网 | 国产1区2区3区精品美女 | 天天操狠狠操夜夜操 | 麻豆精品视频在线 | 99精品国产99久久久久久福利 | 天天插日日射 | 在线免费黄网站 | 欧美一区成人 | 日韩sese| 天天色天天干天天色 | 国产精品美女久久久久久久久久久 | 精品二区视频 | 在线免费视频你懂的 | 丰满少妇一级片 | 韩日电影在线免费看 | 婷婷激情小说网 | 日本黄网站 | 亚洲黄色三级 | 91精品国产乱码久久桃 | 91大神dom调教在线观看 | 久久精品毛片基地 | 黄免费网站| www.五月婷| 亚洲免费公开视频 | 色偷偷人人澡久久超碰69 | 夜夜操狠狠操 | 久久久久高清 | 成人欧美一区二区三区在线观看 | 2023年中文无字幕文字 | 国产不卡视频在线 | 欧美另类美少妇69xxxx | 国产一级片免费观看 | 日韩精品久久久久 | 玖玖精品在线 | 久久精选 | 亚洲精品视频在线观看免费视频 | 久久a级片 | 中文字幕在线播放日韩 | 国内精品美女在线观看 | 国产精品久久久久久久久久妇女 | 91在线91| 中文字幕免费观看 | 成人国产网站 | 中文字幕日韩免费视频 | 狠狠干 狠狠操 | av高清网站在线观看 | 天天干干| 国产传媒一区在线 | 成人动漫精品一区二区 | 久久久久久久网站 | 中文字幕日本在线 | 99精品免费在线 | 国产麻豆视频在线观看 | 国产999精品久久久久久 | av噜噜噜在线播放 | 日韩国产欧美在线播放 | 99久久精品国产欧美主题曲 | 欧美孕妇与黑人孕交 | av888.com| 国产第一二区 | 久久国产午夜精品理论片最新版本 | 成人av午夜| 天堂av在线7 | 色小说在线 | 正在播放国产一区二区 | 中文一区在线观看 | 日韩在线电影观看 | 亚洲 欧美日韩 国产 中文 | 国产免费国产 | 亚洲精品男人天堂 | 久久久精品电影 | 成人黄色片在线播放 | 久草在线观 | 久久综合精品一区 | 9i看片成人免费看片 | 91视频在线播放视频 | 久久99国产精品久久99 | 97狠狠操 | 国产精品日韩欧美 | 国内精品久久久久影院男同志 | 久草久热 | 午夜精品麻豆 | 欧美日韩国产精品一区二区三区 | 国产二区视频在线观看 | 99在线观看免费视频精品观看 | 国产精品美女在线观看 | 亚洲最新av在线 | 日韩高清免费无专码区 | 国产精品99久久免费观看 | 久久久久久久久久福利 | 国产精品区免费视频 | 欧美精品久久久久性色 | 97在线资源 | 99视频精品视频高清免费 | 国产69精品久久app免费版 | 国产乱对白刺激视频在线观看女王 | 天天色天天爱天天射综合 | 中文字幕中文字幕在线中文字幕三区 | 国产又黄又猛又粗 | 国产成人黄色av | 97精品在线 | 国产伦理精品一区二区 | 视频在线观看99 | 看片的网址| 亚洲精品乱码久久久久久蜜桃动漫 | 久久精品96 | 日日久视频| 成人国产在线 | 国产中文字幕三区 | 久久免费高清视频 | 婷婷色中文网 | 亚洲欧美在线综合 | av手机在线播放 | 综合天天色| 欧美一二三在线 | 夜夜操天天干 | 国产精品国产三级在线专区 | 91夫妻视频 | 欧美精品在线观看 | 一区二区中文字幕在线观看 | 国产免费视频在线 | 特级西西www44高清大胆图片 | 在线视频 一区二区 | 亚洲清纯国产 | 国产福利一区二区在线 | 国内久久久久 | 亚洲免费av电影 | 国产高清在线观看av | 激情久久久久 | 人人射人人爽 | 伊人久久五月天 | 国产精选在线 | 中文字幕一区二区三区四区 | 激情五月综合网 | 欧美一级电影 | 在线观看国产日韩欧美 | 五月婷网 | 免费看黄的视频 | 九九热免费观看 | 91精品啪在线观看国产81旧版 | 日韩大片在线观看 | 国产成人精品久久亚洲高清不卡 | 亚洲一区精品人人爽人人躁 | 国产精品1区2区在线观看 | 欧亚久久 | 黄色一区二区在线观看 | 久久国内免费视频 | 亚洲欧洲视频 | 精品一区av | 激情视频综合网 | 97精品国自产拍在线观看 | 91视频中文字幕 | 蜜臀av麻豆| 1000部国产精品成人观看 | 午夜色场| 日本精品久久久一区二区三区 | 美女免费网视频 | 日本狠狠色 | 毛片网站免费在线观看 | 天天艹天天爽 | 欧美日韩免费观看一区二区三区 | 久久久久伊人 | 亚洲精品乱码久久久久久蜜桃欧美 | 五月天久久久 | 国产亚洲精品久久久久秋 | 国产综合精品一区二区三区 | 五月婷婷久草 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 成人三级网站在线观看 | 9999在线视频 | 日韩欧美综合视频 | 日韩精品一区二区三区水蜜桃 | 91亚洲精品久久久蜜桃借种 | 天天干人人干 | 亚洲少妇自拍 | 激情欧美在线观看 | 日韩精品免费在线 | 五月激情婷婷丁香 | 最新日韩视频在线观看 | 91在线视频免费观看 | av免费在线网| 午夜精品久久久久久久99无限制 | 日韩丝袜在线观看 | 欧美 日韩 性 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 韩国一区二区三区在线观看 | 九色激情网 | 久久99国产精品免费 | 黄色免费看片网站 | 中文字幕在线资源 | 亚洲干视频在线观看 | 五月的婷婷| 久草在线欧美 | 激情欧美丁香 | 亚洲经典中文字幕 | 成人精品视频 | 久久最新视频 | 一区二区三区日韩在线观看 | 久久国产精品久久精品国产演员表 | 国产精品久久久久999 | 成人一级在线 | 免费在线播放视频 | 婷婷亚洲五月色综合 | 91福利小视频 | 欧美日韩亚洲一 | 欧美ⅹxxxxxx | 欧美在线视频一区二区三区 | 国产亚洲免费的视频看 | 日韩精品一区二区三区中文字幕 | 国产精品a成v人在线播放 | 国产精品久久久久久69 | 91成年人在线观看 | 亚洲理论在线观看电影 | 国产破处在线播放 | 黄色av在 | www国产亚洲精品久久网站 | 91丨九色丨国产在线观看 | 伊人成人激情 | 欧美与欧洲交xxxx免费观看 | 中文字幕一区二区三区久久 | 国产精品视频永久免费播放 | 国产午夜麻豆影院在线观看 | 欧美a级在线免费观看 | 中文乱码视频在线观看 | 久久久久99精品国产片 | 99九九免费视频 | 亚洲久草在线视频 | 国产偷在线 | 国产精品大片免费观看 | 亚洲精品国产第一综合99久久 | 黄色大全在线观看 | 美女精品在线观看 | 成人一区二区在线观看 | 在线视频app| 免费av在线播放 | 亚州中文av | 成人免费色 | 中文字幕在线播放av | 亚洲日本中文字幕在线观看 | 久久国产影视 | 国产又粗又硬又爽的视频 | 久久综合狠狠综合久久狠狠色综合 | 日韩mv欧美mv国产精品 | 国产精彩视频一区二区 | 一区二区三区免费在线观看视频 | 精品国产电影一区 | 色爱区综合激月婷婷 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲乱码精品 | 国产精品久久久久一区二区 | 欧美精品一区二区蜜臀亚洲 | 在线观看黄网站 | 免费视频三区 | 免费看国产曰批40分钟 | 91成人精品| 日本久草电影 | 精品二区视频 | 一级免费av | 欧美精品国产精品 | a v在线视频 | 99这里只有 | 国产视频2| 三级在线视频播放 | 片网站 | 亚洲精品国产电影 | 人人澡人人爱 | 激情五月***国产精品 | 麻豆va一区二区三区久久浪 | 五月花婷婷 | 在线看中文字幕 | 久久综合色婷婷 | 国产一区二区在线看 | 九九在线高清精品视频 | 91视频 - 114av | 黄色av播放 | 亚洲人久久久 | 日本一区二区不卡高清 | 国产成人99久久亚洲综合精品 | 五月婷婷电影网 | 亚洲成av人片在线观看无 | 欧美激情精品一区 | 国内精品久久久精品电影院 | 精品国产aⅴ麻豆 | 97超碰人人澡人人爱 | 激情视频综合网 | 四虎影视成人永久免费观看视频 | 久久综合国产伦精品免费 | 我要看黄色一级片 | 香蕉视频日本 | 久久私人影院 | 九九九热精品 | 成人av片免费看 | 毛片网在线观看 | 四虎成人网 | 91精品国产福利在线观看 | 免费a v在线 | 天天色天天操综合网 | 91免费国产在线观看 | 国产免费成人av | 黄色免费电影网站 | 偷拍精偷拍精品欧洲亚洲网站 | 在线国产99 | a级片网站 | 国产尤物一区二区三区 | 欧美精品在线免费 | 韩国av一区二区三区 | 国产美女黄网站免费 | 日韩av免费观看网站 | 在线看v片成人 | 99精品国产高清在线观看 | 啪啪动态视频 | 国产第一福利 | 欧美污污网站 | 人人爽人人爽人人爽人人爽 | 欧美色综合天天久久综合精品 | 久99热| 91中文字幕在线观看 | 久久综合九色综合久久久精品综合 | 少妇18xxxx性xxxx片 | 国产精品免费看 | 国产精品 日韩 | 娇妻呻吟一区二区三区 | 免费欧美高清视频 | 五月天.com| 欧美午夜精品久久久久久浪潮 | 成人在线免费观看视视频 | 欧美天堂久久 | 日韩成人邪恶影片 | 欧美久久久久 | 狠狠色丁香婷婷综合久小说久 | 欧美性极品xxxx做受 | 91在线免费播放 | 亚洲最新视频在线 | 久久人人爽爽人人爽人人片av | 99久久精品免费看国产麻豆 | 18国产精品福利片久久婷 | 日韩精选在线 | 久久精品牌麻豆国产大山 | 久久免费国产精品1 | 精久久久久 | 欧美日韩不卡一区二区三区 | 婷婷久久综合九色综合 | 中文字幕 在线看 | 亚洲无吗视频在线 | 国产精品久久久久久99 | 国产精品久久久影视 | 久久九九精品久久 | 中字幕视频在线永久在线观看免费 | 色五月激情五月 | 亚洲午夜精品久久久久久久久 | 亚洲精品免费在线观看视频 | 色在线最新 | 在线观看激情av | 97视频在线免费观看 | av电影不卡在线 | 婷婷5月色| 成人国产精品入口 | 97人人模人人爽人人喊中文字 | 国语精品免费视频 | 99视频在线观看视频 | 亚洲我射av | 久草视频免费在线播放 | 人人爽人人干 | 国产色秀视频 | 久久久久免费精品视频 | 免费三级影片 | 久久天堂影院 | 丰满少妇在线观看资源站 | 美女搞黄国产视频网站 | 午夜精品久久久久久久99无限制 | 日韩视频免费 | 国产69精品久久久久9999apgf | 香蕉视频免费看 | 国产精品第三页 | 五月婷婷导航 | 超碰在线亚洲 | 日韩在线中文字幕视频 | 精品国产一区二区三区久久久蜜臀 | av在线日韩 | 精品影院一区二区久久久 | 亚洲成色777777在线观看影院 | 亚洲综合精品在线 | 国产精品不卡在线播放 | 中文在线8资源库 | 色在线中文字幕 | 国产69精品久久app免费版 | 曰本免费av| 免费网站色 | 激情视频在线观看网址 | 精品在线亚洲视频 | 97热视频 | 91在线永久 | 午夜精品一区二区三区四区 | 99爱精品视频 | 国产区久久 | 91精品国产91久久久久久三级 | 欧日韩在线| 国产免费不卡 | 日韩免费网站 | 国产精品久久久久久久久久妇女 | 精品一区二区久久久久久久网站 | 国内精品视频免费 | 欧美一区二区三区免费看 | 久久综合婷婷国产二区高清 | 欧美一区在线看 | 国产亚洲精品久久久久久 | 国产三级精品三级在线观看 | 超碰在线人 | 一区二区三区精品在线 | 成人免费观看a | 黄色av电影一级片 | 天天操天天添 | 狠狠干电影 | 午夜精品成人一区二区三区 | 久久综合五月 | 国产精品久久久久久久久婷婷 | 久久夜色精品国产欧美一区麻豆 | 久久久国产精品久久久 | 亚洲欧美日本一区二区三区 | 欧美成人性战久久 | 国产黑丝袜在线 | 美女黄频视频大全 | 久久97久久97精品免视看 | 成人免费 在线播放 | 99久久婷婷国产精品综合 | 91精品国自产拍天天拍 | 日韩在线在线 | 狠狠色噜噜狠狠狠 | 国内精品亚洲 | 欧美激情在线网站 | 久久99亚洲精品 | 天天爽夜夜爽人人爽一区二区 | 狠狠狠狠狠狠狠狠干 | av观看在线观看 | 九九精品视频在线观看 | 黄色一级影院 | 成人黄色资源 | 亚洲美女视频在线 | 欧美色图另类 | 超碰国产在线播放 | 91av短视频| 天天干天天色2020 | 亚洲精品中文字幕在线观看 | 精品亚洲视频在线观看 | 日韩av在线高清 | 日韩性片| 天天色综合天天 | 99久久久久国产精品免费 | 最新国产一区二区三区 | 奇米网8888| 亚洲视频电影在线 | 在线观看 国产 | 国产精品一级在线 | 99热99re6国产在线播放 | 丰满少妇高潮在线观看 | 91一区一区三区 | 午夜精品久久久久久久久久久久久久 | 最新中文字幕 | 日韩精品一区二区三区中文字幕 | 国产黄色片一级三级 | 国内少妇自拍视频一区 | 日韩免费在线观看视频 | 国产高清在线a视频大全 | 日本最新一区二区三区 | 一区二区三区在线免费观看 | 五月天天色 | 午夜骚影| 黄在线免费看 | 久久毛片网站 | 亚洲性少妇性猛交wwww乱大交 | 韩国一区二区av | 日韩视频一区二区三区在线播放免费观看 | 亚洲成a人片综合在线 | 国产精品毛片久久蜜 | 亚洲高清视频在线观看免费 | 999国内精品永久免费视频 | 99精品视频在线观看 | 中文字幕中文字幕中文字幕 | 黄色特级一级片 | 伊人五月天av | 午夜成人免费影院 | 日韩欧美极品 | 亚洲黄色区 | 久久精品视频日本 | 久草视频免费看 | 国产精品99免费看 | 丁香婷婷在线观看 | 91麻豆精品一区二区三区 | 国产精品久久久久久久久岛 | 国产美女永久免费 | 99人久久精品视频最新地址 | 国产特级毛片aaaaaaa高清 | 精品久久久久久久久久久久 | a黄色影院 | 中文字幕在线观看第一页 | 国产成人精品一区二区三区网站观看 | 国产精品久久久久久久久久久久午夜 | 二区三区毛片 | 国产精品观看 | 99热国产精品 | 一本之道乱码区 | 91高清免费 | av电影中文字幕 | 麻豆精品视频在线观看免费 | 一区二区三区视频在线 | 在线观看中文字幕 | 久久高视频 | 国产中文字幕一区二区 | 久久久久国产精品免费免费搜索 | 欧美激情xxxx性bbbb | 国产黄a三级三级 | 国产麻豆精品传媒av国产下载 | 九九热在线免费观看 | 午夜国产在线观看 | 成人影片在线免费观看 | 欧美日韩高清在线一区 | 久久香蕉影视 | 日韩激情免费视频 | 国内精品久久久久久久久 | 欧美日韩啪啪 | 在线播放av网址 | 爱爱一区| 亚洲精品在线观 | 亚洲精品视频在线观看免费视频 | 91视频大全| 久久免费国产精品 | 婷婷av综合 | 91免费网站在线观看 | 免费三级av| 国产探花视频在线播放 | 99中文在线 | 久久久久久久久精 | 日韩在线观看中文字幕 | 在线国产小视频 | 国产高清视频在线观看 | 欧美精品一区二区蜜臀亚洲 | 日日夜夜婷婷 | 国产一级在线看 | 伊人天堂av | 久久综合久久综合这里只有精品 | 91精品成人 | 久久综合影音 | 日日草天天草 | 成人av片在线观看 | 精品国产一区二区三区男人吃奶 | 国产探花视频在线播放 | 久久www免费人成看片高清 | 日韩欧美一区二区不卡 |