99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

雙緩沖隊(duì)列異步日志系統(tǒng):高并發(fā)場(chǎng)景下徹底解決同步日志阻塞問(wèn)題

雙緩沖隊(duì)列異步日志系統(tǒng):高并發(fā)場(chǎng)景下徹底解決同步日志阻塞問(wèn)題 1. 先別急著一股腦寫(xiě)文件同步日志為什么扛不住生產(chǎn)環(huán)境先說(shuō)結(jié)論再聊細(xì)節(jié)日志系統(tǒng)最容易被低估也最容易被埋雷。很多項(xiàng)目剛開(kāi)始的時(shí)候日志就是到處printf或者更“規(guī)范”一點(diǎn)接個(gè)log4j、spdlog級(jí)別的庫(kù)線上跑一跑也沒(méi)覺(jué)得有什么問(wèn)題。但等流量上來(lái)高并發(fā)場(chǎng)景一壓第一塊倒下的往往不是業(yè)務(wù)代碼而是看似人畜無(wú)害的日志鏈路。我們做雙緩沖隊(duì)列異步日志系統(tǒng)要解決的核心痛點(diǎn)很簡(jiǎn)單日志寫(xiě)入不再阻塞業(yè)務(wù)線程。同步日志為什么會(huì)阻塞因?yàn)閣rite()到磁盤(pán)并不便宜。一個(gè)日志條目看起來(lái)只是一行字符串但這條字符串從用戶態(tài)的日志緩沖區(qū)到內(nèi)核的文件系統(tǒng)緩存再到真正的磁盤(pán)設(shè)備中間隔著至少兩道拷貝還伴隨一次系統(tǒng)調(diào)用。生產(chǎn)環(huán)境里無(wú)論是機(jī)械硬盤(pán)還是 SSD單次寫(xiě)入的小 IO 都遠(yuǎn)沒(méi)有想象中的快。日志一多、高頻一寫(xiě)業(yè)務(wù)線程就被迫排隊(duì)等磁盤(pán)。我舉個(gè)真實(shí)場(chǎng)景某線上服務(wù)需要記錄每次請(qǐng)求的完整參數(shù)和響應(yīng)體單個(gè)請(qǐng)求撐死幾十行日志但 QPS 上了幾千之后同步日志的磁盤(pán)寫(xiě)壓力瞬間拉滿接口平均耗時(shí)從 2ms 漲到了 40ms最夸張的時(shí)候業(yè)務(wù)線程被日志卡的連心跳包都發(fā)不出去。后來(lái)把策略改成“攢一批再寫(xiě)”問(wèn)題才算緩解。這就是異步日志的核心思路把日志寫(xiě)入從業(yè)務(wù)線程上搬走交給專門(mén)的線程去處理。業(yè)務(wù)線程只負(fù)責(zé)把日志內(nèi)容往內(nèi)存里一放就返回磁盤(pán)寫(xiě)入由后臺(tái)線程異步完成。聽(tīng)起來(lái)簡(jiǎn)單但實(shí)現(xiàn)上有很多講究尤其是“怎么把日志內(nèi)容安全高效地交到后臺(tái)線程”這一步選型不同效果天差地別。雙緩沖隊(duì)列就是這條鏈路里比較經(jīng)典、也比較容易理解的一種實(shí)現(xiàn)方案。如果你現(xiàn)在正被“日志寫(xiě)入拖慢接口”“日志一多系統(tǒng)就卡頓”“日志模塊與業(yè)務(wù)模塊共用鎖導(dǎo)致死等”這些問(wèn)題困擾這篇文章適合你。我會(huì)從設(shè)計(jì)思路講到接口封裝再到部署使用把雙緩沖日志系統(tǒng)的“上半場(chǎng)”講透。2. 雙緩沖隊(duì)列的工作機(jī)制把“寫(xiě)日志”和“寫(xiě)磁盤(pán)”拆開(kāi)2.1 兩段式緩沖一個(gè)正寫(xiě)一個(gè)在刷雙緩沖隊(duì)列這個(gè)名字關(guān)鍵在于“雙”和“隊(duì)列”?!熬彌_”比較好理解就是一塊預(yù)先分配好的內(nèi)存。日志內(nèi)容先落在這塊內(nèi)存里攢多了再一次性寫(xiě)入磁盤(pán)。為什么要攢因?yàn)橐淮蝫rite()寫(xiě)入 1MB 數(shù)據(jù)和分 1 萬(wàn)次每次寫(xiě) 100 字節(jié)兩者的 IO 效率完全是兩個(gè)量級(jí)。批量寫(xiě)不僅能大大減少系統(tǒng)調(diào)用的次數(shù)還能讓磁盤(pán)的寫(xiě)模式更規(guī)整性能提升非常明顯。“雙緩沖”指的是這塊預(yù)分配內(nèi)存有兩份。一份被業(yè)務(wù)線程用來(lái)寫(xiě)入日志稱為“待寫(xiě)緩沖區(qū)”或“當(dāng)前緩沖區(qū)”另一份被后臺(tái)線程用來(lái)讀取并刷入磁盤(pán)稱為“待刷緩沖區(qū)”。當(dāng)“當(dāng)前緩沖區(qū)”寫(xiě)滿了或者到了固定時(shí)間系統(tǒng)會(huì)執(zhí)行一次緩沖區(qū)交換swap把業(yè)務(wù)線程寫(xiě)滿的這塊換成后臺(tái)線程手里的那塊。交換之后業(yè)務(wù)線程繼續(xù)往新?lián)Q來(lái)的空緩沖區(qū)里寫(xiě)后臺(tái)線程則拿著裝滿日志的緩沖區(qū)去刷磁盤(pán)。圖景大概是這樣業(yè)務(wù)線程 后臺(tái)線程 | | | 寫(xiě)入Buffer A | |-------------| | Buffer A滿 | | 交換 | |-------------| | 寫(xiě)入Buffer B | | | 刷Buffer A到磁盤(pán) | |------------- Disk簡(jiǎn)化成文字描述就是業(yè)務(wù)線程永遠(yuǎn)只面對(duì)一塊“可以寫(xiě)”的內(nèi)存寫(xiě)完一塊就換一塊完全不碰磁盤(pán) IO。后臺(tái)線程永遠(yuǎn)只面對(duì)一塊“已經(jīng)寫(xiě)滿”的內(nèi)存刷完一塊就換一塊完全不阻塞業(yè)務(wù)線程。兩者之間只有一次極短的交換操作需要同步。2.2 為什么是“雙”緩沖而不是單緩沖或多緩沖單緩沖的方案看起來(lái)也能用一塊緩沖區(qū)寫(xiě)滿了就刷盤(pán)刷盤(pán)期間業(yè)務(wù)線程等著。但問(wèn)題在于“寫(xiě)滿后刷盤(pán)”這個(gè)動(dòng)作是阻塞的而且刷盤(pán)耗時(shí)不定。一旦磁盤(pán)繁忙業(yè)務(wù)線程就卡住了和同步日志沒(méi)有本質(zhì)區(qū)別只是把fprintf換成了memcpy仍然治標(biāo)不治本。多緩沖方案呢理論上可以準(zhǔn)備 N 塊緩沖區(qū)寫(xiě)滿一塊就換下一塊后臺(tái)線程依次刷。這能進(jìn)一步降低交換頻率內(nèi)存占用也更高。但在大部分場(chǎng)景下兩塊緩沖區(qū)已經(jīng)足夠只要后臺(tái)線程刷盤(pán)的平均速度大于業(yè)務(wù)線程寫(xiě)入的平均速度兩塊就能循環(huán)起來(lái)。如果后臺(tái)線程的消費(fèi)速度跟不上說(shuō)明系統(tǒng)已經(jīng)到了日志量過(guò)載的狀態(tài)即使準(zhǔn)備更多緩沖區(qū)也只是延緩問(wèn)題并不能消除問(wèn)題。這里有個(gè)很多人會(huì)忽略的點(diǎn)雙緩沖系統(tǒng)里的交換是“一次性”完成的。生產(chǎn)線程與消費(fèi)線程之間只共享一個(gè)狀態(tài)指針一次 swap 操作只需要幾納秒到幾十納秒的臨界區(qū)保護(hù)。對(duì)比直接用std::queue存日志的逐條入隊(duì)方案雙緩沖避免了高頻的鎖競(jìng)爭(zhēng)把鎖的粒度從“每條日志”降到了“每批日志”這是它能扛高吞吐的根本原因。另外雙緩沖天然支持延遲刷新。很多時(shí)候日志峰值只出現(xiàn)在一秒內(nèi)的某幾百毫秒中其他時(shí)間業(yè)務(wù)線程并不忙。如果每寫(xiě)一條就通知后臺(tái)線程來(lái)取線程喚醒、上下文切換的成本反而會(huì)拖垮性能。雙緩沖方案可以設(shè)定“緩沖區(qū)未滿就定時(shí)刷”比如每 1 秒強(qiáng)制交換一次保證日志延遲可控且不會(huì)出現(xiàn)長(zhǎng)時(shí)間無(wú)輸出。2.3 雙緩沖的兩個(gè)隱藏風(fēng)險(xiǎn)設(shè)計(jì)時(shí)繞不開(kāi)第一個(gè)風(fēng)險(xiǎn)是日志丟失。異步意味著業(yè)務(wù)線程返回時(shí)日志還沒(méi)落盤(pán)如果此時(shí)進(jìn)程崩潰或者被kill -9最后一段還在內(nèi)存里的日志就沒(méi)了。這個(gè)問(wèn)題沒(méi)法完全規(guī)避只能降低損失。常見(jiàn)做法是后臺(tái)線程定期刷盤(pán)并且支持外部顯式調(diào)用Flush()在需要保命的關(guān)鍵節(jié)點(diǎn)比如服務(wù)收到終止信號(hào)后強(qiáng)制把所有緩沖數(shù)據(jù)落盤(pán)。第二個(gè)風(fēng)險(xiǎn)是背壓?jiǎn)栴}。如果日志生產(chǎn)速度長(zhǎng)期超過(guò)消費(fèi)速度緩沖區(qū)很快會(huì)處于“寫(xiě)滿-交換-刷盤(pán)-再寫(xiě)滿”的循環(huán)表現(xiàn)為磁盤(pán)持續(xù)高負(fù)載系統(tǒng)整體性能下降。此時(shí)不能無(wú)限等下去常見(jiàn)策略是當(dāng)兩緩沖都占滿且后臺(tái)線程來(lái)不及刷時(shí)要么直接丟棄未來(lái)日志并按計(jì)數(shù)報(bào)錯(cuò)要么將當(dāng)前緩沖區(qū)擴(kuò)容一擋臨時(shí)救急。我一般推薦前者因?yàn)槿罩玖窟^(guò)載時(shí)保留完整性的優(yōu)先級(jí)低于保證業(yè)務(wù)可用性而且丟失提示本身也是重要日志。3. 核心接口設(shè)計(jì)Buffer、隊(duì)列交換與 AsyncLogger設(shè)計(jì)雙緩沖日志系統(tǒng)時(shí)最重要的是把三個(gè)角色拆清楚Buffer負(fù)責(zé)存儲(chǔ)字節(jié)流BufferQueue負(fù)責(zé)管理兩個(gè) Buffer 的交換與調(diào)度AsyncLogger負(fù)責(zé)向上層業(yè)務(wù)提供日志寫(xiě)入 API同時(shí)管理后臺(tái)線程的生命周期。3.1 Buffer 的核心字段與內(nèi)存使用Buffer本質(zhì)是一塊預(yù)分配內(nèi)存加上讀寫(xiě)游標(biāo)。我常用的定義大概是class Buffer { public: explicit Buffer(size_t capacity) { data_.reserve(capacity); } void Append(const char* log, size_t len) { if (len WritableBytes()) { return; // 或觸發(fā)擴(kuò)容 / 丟棄策略 } data_.insert(data_.end(), log, log len); } void Reset() { data_.clear(); } bool Empty() { return data_.empty(); } size_t WritableBytes() { return data_.capacity() - data_.size(); } const char* Data() { return data_.data(); } size_t Size() { return data_.size(); } private: std::vectorchar data_; };注意這里我用的是std::vector而不是裸指針加char[]。生產(chǎn)級(jí)日志系統(tǒng)對(duì)性能苛刻通常會(huì)直接用預(yù)分配的char[]配合size_t游標(biāo)甚至用mmap映射文件。但std::vector足夠滿足絕大多數(shù)業(yè)務(wù)系統(tǒng)的日志壓力而且內(nèi)存管理更安全。真正要緊的是讓 Buffer 的容量在初始化時(shí)一次定好盡量避免運(yùn)行期擴(kuò)容——擴(kuò)容可能觸發(fā)內(nèi)存搬移而且擴(kuò)容期間的操作會(huì)引入額外的不確定性。Buffer 容量取多大這個(gè)沒(méi)有標(biāo)準(zhǔn)答案。我個(gè)人的經(jīng)驗(yàn)值是單條日志平均長(zhǎng)度按 256 字節(jié)估如果 QPS 峰值為 1 萬(wàn)每秒日志量約為 2.5MB那么每塊 Buffer 設(shè)為 8MB 左右比較合適兩塊就是 16MB。日志量小的服務(wù)4MB 也已經(jīng)足夠了。內(nèi)存是便宜的資源不必太摳但也不要拍腦袋選個(gè) 1GB —— 那會(huì)讓緩存的優(yōu)勢(shì)變成內(nèi)存的壓力。3.2 BufferQueue 的交換邏輯BufferQueue是雙緩沖結(jié)構(gòu)的中樞。它內(nèi)部維護(hù)兩個(gè) Buffer 指針并在合適的時(shí)機(jī)執(zhí)行交換。class BufferQueue { public: explicit BufferQueue(size_t buffer_capacity) : buffer_capacity_(buffer_capacity), current_(new Buffer(buffer_capacity)), next_(new Buffer(buffer_capacity)) {} void Append(const char* data, size_t len) { std::lock_guardstd::mutex lock(mutex_); if (current_-WritableBytes() len) { Swap(); } current_-Append(data, len); } std::shared_ptrBuffer TakeForFlush() { std::lock_guardstd::mutex lock(mutex_); if (current_-Empty() next_-Empty()) { return nullptr; } Swap(); return std::shared_ptrBuffer swap_result_; } private: void Swap() { std::swap(current_, next_); // 這里同時(shí)喚醒消費(fèi)線程 } size_t buffer_capacity_; std::unique_ptrBuffer current_; std::unique_ptrBuffer next_; std::mutex mutex_; std::condition_variable cond_; };這段邏輯里有幾個(gè)微妙的地方第一Append時(shí)發(fā)現(xiàn)當(dāng)前緩沖區(qū)寫(xiě)不下一條日志立刻交換然后把日志寫(xiě)到新緩沖區(qū)上。這意味著next_可能已經(jīng)在積累數(shù)據(jù)了交換前它會(huì)被重置。這里有一個(gè)取舍如果next_里還有沒(méi)來(lái)得及被后臺(tái)線程刷盤(pán)的數(shù)據(jù)交換會(huì)造成日志順序錯(cuò)亂或數(shù)據(jù)覆蓋。所以更嚴(yán)謹(jǐn)?shù)膶?xiě)法是當(dāng)Append時(shí)current_寫(xiě)不下且next_非空即后臺(tái)線程還沒(méi)取走過(guò)要介入“等待消費(fèi)線程完成一次 flush”的流程。我在實(shí)現(xiàn)時(shí)通過(guò)條件變量控制保證交換發(fā)生時(shí)next_一定是已經(jīng)刷完的空 Buffer。第二條件變量的喚醒時(shí)機(jī)。最直接的邏輯是Swap()之后立刻喚醒后臺(tái)線程。但如果每次Append都喚醒日志量一高線程頻繁被喚醒上下文切換成本就上去了。我的做法是只有滿足“當(dāng)前緩沖區(qū)由空變?yōu)榉强铡被颉敖粨Q發(fā)生時(shí)next_中有數(shù)據(jù)”這兩個(gè)條件才喚醒。這能把線程喚醒次數(shù)與日志寫(xiě)入頻率解耦后臺(tái)線程還可以配合定時(shí)策略每 100ms 檢查一次。3.3 AsyncLogger 的對(duì)外接口設(shè)計(jì)對(duì)外接口是我的原則是極簡(jiǎn)。業(yè)務(wù)方不需要理解雙緩沖內(nèi)部機(jī)制他們只需要“初始化、寫(xiě)日志、關(guān)閉”這三個(gè)動(dòng)作。class AsyncLogger { public: static AsyncLogger* Instance(); bool Init(const LogConfig config); void Write(LogLevel level, const char* fmt, ...); void Flush(); void Shutdown(); private: AsyncLogger(); ~AsyncLogger(); void WriteToBuffer(const char* line, size_t len); void FlushThread(); std::unique_ptrBufferQueue queue_; std::thread background_thread_; std::atomicbool running_{false}; LogLevel level_{LOG_INFO}; };Init()初始化配置啟動(dòng)后臺(tái)線程Write()格式化日志寫(xiě)入 BufferQueue返回即代表日志“已受理”Flush()強(qiáng)制刷新緩沖區(qū)用于關(guān)鍵節(jié)點(diǎn)Shutdown()停止后臺(tái)線程刷完所有遺留數(shù)據(jù)安全退出Write()為什么設(shè)計(jì)成可變參數(shù)因?yàn)槲蚁M罩菊{(diào)用點(diǎn)在形式上盡可能接近原生的printf。業(yè)務(wù)側(cè)配合宏定義使用體驗(yàn)上就像寫(xiě)printf一樣自然#define LOG_DEBUG(...) AsyncLogger::Instance()-Write(LOG_DEBUG, __VA_ARGS__) #define LOG_INFO(...) AsyncLogger::Instance()-Write(LOG_INFO, __VA_ARGS__) #define LOG_ERROR(...) AsyncLogger::Instance()-Write(LOG_ERROR, __VA_ARGS__)在Write()內(nèi)部格式化日志用vsnprintf完成這是一個(gè)常見(jiàn)的性能熱區(qū)。vsnprintf本身不慢但如果每條日志都調(diào)用在超高并發(fā)場(chǎng)景下仍會(huì)占用大量 CPU。優(yōu)化的思路是把格式化拆成兩步先在生產(chǎn)線程上完成字符串拼接雙緩沖只負(fù)責(zé)搬運(yùn)已經(jīng)成型的字節(jié)流。后臺(tái)線程不能再做格式化否則格式化開(kāi)銷(xiāo)就從業(yè)務(wù)線轉(zhuǎn)移到了后臺(tái)很快會(huì)成為新的瓶頸。4. 部署與使用指南從配置到線上切換的完整流程4.1 配置項(xiàng)的選擇與建議初始化日志系統(tǒng)時(shí)我給LogConfig設(shè)計(jì)了四個(gè)最關(guān)鍵的配置項(xiàng)日志文件路徑前綴、單塊緩沖區(qū)大小、日志級(jí)別、刷新間隔。配置項(xiàng)推薦值說(shuō)明base_filename日志目錄 文件名前綴例如/var/log/app/server_buffer_capacity4MB ~ 16MB根據(jù) QPS 估算內(nèi)存緊張可降到 1MBlog_levelLOG_INFO或LOG_WARN生產(chǎn)環(huán)境不建議開(kāi) DEBUGflush_interval100ms ~ 1000ms越小日志越實(shí)時(shí)但刷盤(pán)越頻繁這里的核心原則是緩沖容量不是越大越好刷新間隔也不是越小越好。容量太大內(nèi)存里堆積的日志變多一旦崩潰丟的就多刷新間隔太小疊加的批量寫(xiě)效果被削弱。線上我常用的組合是8MB 緩沖區(qū)、200ms 刷新間隔、LOG_INFO級(jí)別。這個(gè)組合在各種服務(wù)上表現(xiàn)都比較均衡。文件切分也建議在設(shè)計(jì)時(shí)就考慮進(jìn)去。日志系統(tǒng)跑久了單個(gè)日志文件無(wú)限增長(zhǎng)是災(zāi)難。我通常會(huì)再提供兩個(gè)參數(shù)max_file_size和max_file_count。當(dāng)單文件超過(guò)max_file_size寫(xiě)入切換到下一個(gè)文件當(dāng)文件數(shù)量超過(guò)max_file_count刪除最老的文件。這樣磁盤(pán)占用能被嚴(yán)格限制在可控范圍內(nèi)。4.2 初始化到寫(xiě)日志的代碼示例以一個(gè)典型服務(wù)的主程序?yàn)槔齣nt main() { LogConfig cfg; cfg.base_filename /var/log/app/order_; cfg.buffer_capacity 8 * 1024 * 1024; // 8MB cfg.log_level LogLevel::LOG_INFO; cfg.flush_interval_ms 200; cfg.max_file_size 512 * 1024 * 1024; // 512MB滾動(dòng) cfg.max_file_count 10; if (!AsyncLogger::Instance()-Init(cfg)) { std::cerr init logger failed std::endl; return 1; } LOG_INFO(server started, enabled modules: %s, core,order,pay); // 業(yè)務(wù)邏輯... LOG_DEBUG(request%s, response%s, req_str, resp_str); // 程序退出前 AsyncLogger::Instance()-Shutdown(); return 0; }注意Shutdown()之間的業(yè)務(wù)邏輯如果存在長(zhǎng)期運(yùn)行的線程日志系統(tǒng)必須是線程安全的。我在Write()內(nèi)部用了BufferQueue::Append()上的鎖所以多線程寫(xiě)日志不會(huì)互相干擾。對(duì)于日志順序要求很高的場(chǎng)景順序僅由鎖獲取的順序決定——大多數(shù)業(yè)務(wù)場(chǎng)景不需要關(guān)心這一點(diǎn)。有個(gè)體驗(yàn)上的細(xì)節(jié)日志文件里的時(shí)間戳格式。建議輸出格式帶上精確到毫秒的時(shí)間戳、線程 ID 和日志級(jí)別。后臺(tái)服務(wù)排查問(wèn)題特別是偶發(fā)問(wèn)題缺少線程 ID 會(huì)讓上下文追蹤變得非常痛苦。格式類似2025-01-18 14:23:45.678 [12345] INFO request accepted, traceabc1234.3 進(jìn)程優(yōu)雅退出時(shí)的日志處理進(jìn)程退出時(shí)的日志處理是最容易被忽略的坑。如果直接調(diào)用exit()后臺(tái)線程可能才格式化完一半日志進(jìn)程就沒(méi)了。正確順序是通知所有業(yè)務(wù)線程不再寫(xiě)日志或至少保證寫(xiě)日志操作已經(jīng)返回調(diào)用Shutdown()在Shutdown()內(nèi)部停止后臺(tái)刷新線程并把隊(duì)列里剩余的所有 Buffer 全部刷盤(pán)最后進(jìn)程退出為什么必須在Shutdown()里“清空所有 Buffer”因?yàn)槊r(shí)可能有兩個(gè)非空 Buffer一個(gè)是正在寫(xiě)入還沒(méi)滿的一個(gè)是交換后還沒(méi)被后臺(tái)線程取走的。如果只刷了當(dāng)前移交的那個(gè) Buffer另一個(gè)殘留的數(shù)據(jù)就丟了。測(cè)試中就很容易出現(xiàn)一種情況平時(shí)日志正常但進(jìn)程退出瞬間最后幾十條日志神秘失蹤根源就在這里。4.4 信號(hào)處理與崩潰保底線上服務(wù)被kill是常事。比如SIGTERM時(shí)一般會(huì)希望優(yōu)雅退出。我的做法是注冊(cè)了信號(hào)處理器在捕捉到SIGTERM和SIGINT后調(diào)用Shutdown()再退出。但對(duì)于SIGKILL和段錯(cuò)誤SIGSEGV進(jìn)程瞬間死亡任何代碼都來(lái)不及執(zhí)行此時(shí)只能依賴“日志文件最近一次 flush 之后的內(nèi)容未丟失”這一保證。有個(gè)小技巧可以降低崩潰恢復(fù)的代價(jià)日志系統(tǒng)的后臺(tái)線程每次寫(xiě)完一個(gè) Buffer就執(zhí)行一次fdatasync()或者至少是flush()而不是等到文件關(guān)閉時(shí)再刷。這樣崩潰后最多丟失的就是上一次 flush 之后的數(shù)據(jù)。代價(jià)是磁盤(pán) IO 頻率上升但換來(lái)的是日志可靠性。5. 高頻日志場(chǎng)景下最容易踩的坑和調(diào)優(yōu)路徑5.1 問(wèn)題一日志大量丟失而且丟得沒(méi)有規(guī)律很多第一次用異步日志的團(tuán)隊(duì)上線后發(fā)現(xiàn)日志有缺口第一個(gè)懷疑是磁盤(pán) IO 不夠但實(shí)際上經(jīng)常是Buffer 容量太小 生產(chǎn)速度大于消費(fèi)速度的組合。排查思路在Append()里加一個(gè)丟棄計(jì)數(shù)當(dāng)出現(xiàn)“當(dāng)前緩沖區(qū)寫(xiě)不下且next_也沒(méi)法交換”的情況時(shí)直接丟棄該條日志并累計(jì)計(jì)數(shù)。日志系統(tǒng)可以每秒打印一次這個(gè)計(jì)數(shù)到標(biāo)準(zhǔn)輸出或單獨(dú)的文件。如果丟包率持續(xù)增長(zhǎng)說(shuō)明日志量與 Buffer 容量不匹配。調(diào)優(yōu)手段有兩個(gè)方向增大單塊 Buffer 容量讓攢批的窗口更長(zhǎng)增加后臺(tái)刷新線程數(shù)量或提高刷新頻率注意方向 2 有一個(gè)副作用線程數(shù)量增加意味著刷新更頻繁可能削弱批量寫(xiě)效果。我個(gè)人的經(jīng)驗(yàn)是先嘗試把刷新間隔從 200ms 調(diào)整到 100ms如果還不夠再考慮擴(kuò)容 Buffer一般不推薦加第二個(gè)后臺(tái)線程除非數(shù)據(jù)量真的到了單線程刷盤(pán)上限。5.2 問(wèn)題二雙緩沖交換時(shí)鎖競(jìng)爭(zhēng)激烈日志線程本身成為瓶頸業(yè)務(wù)線程在調(diào)用Write()時(shí)最終都會(huì)進(jìn)入BufferQueue::Append()。當(dāng)日志量大時(shí)這把鎖就成了高頻熱點(diǎn)。雖然我的設(shè)計(jì)里鎖只保護(hù)了一次 append 加一次可能的 swap但 QPS 極高的服務(wù)依然能把這把鎖的競(jìng)爭(zhēng)壓力拉滿。應(yīng)對(duì)辦法有幾個(gè)按性價(jià)比排序用更精細(xì)的鎖替代std::mutex比如std::shared_mutex在日志量極高時(shí)寫(xiě)鎖其實(shí)不多只在交換的時(shí)候大部分是讀鎖。每個(gè)業(yè)務(wù)線程獨(dú)立的小 Buffer先寫(xiě)入線程本地緩沖積攢到一定閾值再合并到主雙緩沖隊(duì)列。這個(gè)方案稍微復(fù)雜但能大幅降低鎖競(jìng)爭(zhēng)。接受現(xiàn)狀只把日志級(jí)別開(kāi)關(guān)在生產(chǎn)環(huán)境關(guān)掉80% 的日志量來(lái)自 DEBUG生產(chǎn)環(huán)境把級(jí)別調(diào)到 INFO 以上絕大部分性能問(wèn)題自然消失我推薦從第 3 步開(kāi)始。很多團(tuán)隊(duì)上線時(shí)忘了關(guān) DEBUG日志量爆炸式增長(zhǎng)最后怪異步日志系統(tǒng)不行。實(shí)際上把 DEBUG 一關(guān)系統(tǒng)壓力立減 80%。5.3 問(wèn)題三日志內(nèi)容里包含二進(jìn)制、亂碼或超長(zhǎng)行日志系統(tǒng)最常見(jiàn)的使用誤區(qū)是把任意二進(jìn)制數(shù)據(jù)塞進(jìn)日志文本。比如記錄網(wǎng)絡(luò)上報(bào)文的原始字節(jié)或者記錄一個(gè)包含\n的字符串。這些數(shù)據(jù)會(huì)導(dǎo)致日志文件結(jié)構(gòu)被破壞后續(xù)按行解析時(shí)自然錯(cuò)亂。我的做法是在Write()時(shí)對(duì)非打印字符做轉(zhuǎn)義處理。尤其注意\n、\r、\0這幾個(gè)字符轉(zhuǎn)成\\n、\\r之類的可見(jiàn)文本。如果業(yè)務(wù)確實(shí)需要記錄完整的二進(jìn)制 dump建議單獨(dú)設(shè)計(jì)一個(gè)WriteBinary()接口走十六進(jìn)制編碼再寫(xiě)文本日志而不是硬塞。另外設(shè)置單條日志的最大長(zhǎng)度。通常一條日志超過(guò) 4KB 就已經(jīng)很夸張了遇到超長(zhǎng)內(nèi)容寧可截?cái)嘁膊荒苋嗡鼡伪?Buffer。vsnprintf本身就支持傳入長(zhǎng)度上限超出部分返回的長(zhǎng)度大于實(shí)際寫(xiě)入長(zhǎng)度你可以據(jù)此判斷是否發(fā)生截?cái)嗖⒀a(bǔ)一個(gè)“日志超長(zhǎng)截?cái)唷钡臉?biāo)記。5.4 問(wèn)題四日志線程退出時(shí)隊(duì)列里還有數(shù)據(jù)沒(méi)來(lái)得及寫(xiě)這個(gè)問(wèn)題在“4.3 進(jìn)程優(yōu)雅退出”里提過(guò)。但還有一種特殊情況后臺(tái)線程在刷最后一個(gè) Buffer 時(shí)業(yè)務(wù)線程仍然在搶鎖寫(xiě)日志兩者互相等待甚至死鎖。我處理的辦法是Shutdown()先把running_原子變量置為false這樣業(yè)務(wù)線程再調(diào)用Write()時(shí)直接放棄寫(xiě)入并返回。接著后臺(tái)線程拿到隊(duì)列鎖把剩下的 Buffer 全部刷盤(pán)。這樣保證了退出路徑上沒(méi)有新的數(shù)據(jù)生成也不會(huì)卡住主程序。5.5 性能數(shù)據(jù)參考與容量估算在常見(jiàn)的高配服務(wù)器上普通 SSD 磁盤(pán)雙緩沖異步日志能實(shí)現(xiàn)百萬(wàn)級(jí)日志行每秒的寫(xiě)入能力。更保守地講和同步日志相比任何一條fprintf直接落盤(pán)的方案切換到雙緩沖異步方案后日志側(cè)性能都能提升一到兩個(gè)數(shù)量級(jí)。給一個(gè)我實(shí)際線上服務(wù)的配置參考業(yè)務(wù)HTTP 網(wǎng)關(guān)高峰期 QPS 1.2 萬(wàn)每請(qǐng)求約產(chǎn)生 8 條日志日志寫(xiě)入峰值約 10 萬(wàn)條/秒文本量約 30~40 MB/s配置雙緩沖各 16MB刷新間隔 100ms日志等級(jí) INFO實(shí)測(cè)結(jié)果業(yè)務(wù)接口 P99 耗時(shí)波動(dòng)小于 1ms日志線程 CPU 占用約 12%這組數(shù)據(jù)可以當(dāng)作一個(gè)估算基線如果你們的日志量是這個(gè)規(guī)模的 5 到 10 倍就該考慮引入多級(jí)緩沖或者直接上專業(yè)的日志采集框架了。5.6 快速故障排查表現(xiàn)象可能原因排查手段日志文件出現(xiàn)缺口Buffer 容量不足 / 刷新線程未跟上檢查丟棄計(jì)數(shù)擴(kuò)容 Buffer 或調(diào)短刷新間隔日志線程 CPU 過(guò)高格式化在后臺(tái)線程執(zhí)行 / 鎖競(jìng)爭(zhēng)嚴(yán)重確保格式化在生產(chǎn)線程完成關(guān) DEBUG 日志日志亂碼或錯(cuò)行二進(jìn)制數(shù)據(jù)未轉(zhuǎn)義在 Write() 中加入轉(zhuǎn)義邏輯限制單條長(zhǎng)度退出時(shí)最后日志丟失Shutdown 未清空剩余 Buffer檢查 Shutdown 實(shí)現(xiàn)確保刷完所有 Buffer日志按小時(shí)延遲刷新間隔過(guò)大 / 文件緩存未刷調(diào)小 flush_interval 或加入定時(shí) flush6. 用了一段時(shí)間之后的幾點(diǎn)體會(huì)雙緩沖日志系統(tǒng)已經(jīng)在我們這邊服務(wù)里平穩(wěn)跑了挺長(zhǎng)時(shí)間最大的感受是“日志”和“業(yè)務(wù)”終于不再互相牽扯。以前同步日志時(shí)代每次線上問(wèn)題排查都要祈禱日志別把系統(tǒng)拖慢切到異步之后日志只是安靜地把該記的記下來(lái)業(yè)務(wù)線程完全不用關(guān)心磁盤(pán)的脾氣。如果只看設(shè)計(jì)雙緩沖方案的代碼量并不大核心邏輯可能兩三百行就能寫(xiě)完。但真正值錢(qián)的不是代碼而是對(duì)邊角情況的處理。比如交換時(shí) Buffer 的狀態(tài)判斷、Shutdown 時(shí)清理隊(duì)列的邏輯、超長(zhǎng)日志的截?cái)嗯c轉(zhuǎn)義這些細(xì)節(jié)決定了系統(tǒng)在線上是否可靠。文檔里不會(huì)告訴你這些坑只有實(shí)際踩過(guò)才知道。還有一點(diǎn)個(gè)人建議日志系統(tǒng)的代碼最好保持簡(jiǎn)單、可讀、少依賴。它不像業(yè)務(wù)模塊那樣圍繞架構(gòu)演進(jìn)穩(wěn)定和可靠永遠(yuǎn)排在第一位。就算將來(lái)要升級(jí)也盡量在現(xiàn)有接口上做增量改動(dòng)而不是推倒重來(lái)。下一篇文章我會(huì)把雙緩沖隊(duì)列日志系統(tǒng)的完整實(shí)現(xiàn)代碼展開(kāi)講包括后臺(tái)線程的調(diào)度細(xì)節(jié)、文件滾動(dòng)策略的具體寫(xiě)法以及如何把日志量級(jí)擴(kuò)展到更高。如果你現(xiàn)在遇到日志性能上的問(wèn)題建議先按這篇文章的設(shè)計(jì)思路把手里的同步日志替換成異步雙緩沖版親身體會(huì)一下“日志不再拖后腿”的差別。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97久久超碰| 国产亚洲色婷婷久久99精品9j| 五月天激情网址| 九月停停| 成人中文网| 182TV大香蕉| 六月婷伊人| 久久综合无| 丁香六月在线综合| 夜夜穞天天穞狠狠穞AV美女按摩| 免费婷婷| 在线观看婷婷5月| 色吧五月婷婷六月丁香| 人人色人人摸人人看| 婷五月天丁香婷五月| 婷婷色五月激情| 五月激情天| 婷婷五月天va| 伦乱美欧| 天堂爱爱| 五月婷婷六月丁香激情综合网| 六月婷婷综合久久| 亚洲精品中文字幕成人片| 天天射影院| 99操久久| 色色婷婷丁香| 99久久九九| 丁香婷婷色五月| 色吧五月婷婷六月丁香| 精品无码人妻一区| 思思热性操| 五月天婷婷日日爱| 色色亚洲无码| 手机激情网| 99er日韩| 777丁香六月青青草婷婷综合久月| 九九色人| 五月婷婷中字在线| 天天色五月| 日本综合色图| 这里只有精彩小视频视频网站| 成人网站av免费网站推荐| 久久九九热38| 91综合网| 婷婷五月网图片区| 97色在线视频| 天天综合亚洲综合网天天αⅴ| 99久久99九九99九九九| 婷婷五月丁香六月伊人网| 性视频久久| 丁香五婷| 99er这里只有精品视频| 成人超碰AV| 超碰人人色| 九九综合色综合| 中文字幕五月久久婷| 丁香五月WWW| Caoporn公开| 69久久久| 婷婷无码视频| 丁香狠狠| 精品A√| 丁香网五月天激情| 久久婷婷久久| 久久久com| 噜噜在线| 综合 蜜月 婷婷| 人妻中文字幕网| 丁香五月婷婷天堂大香蕉| 美女伊人久久| 伍月婷丁香婷| 五月天综合在线观看| 曰日爽日日操| 久久九九综合| 丁香影院五月综合| 丁香色色网| 影音先锋色色色资源色资源色| 开心久久五月天| 深爱激情九九五月天 | 99精品激情| 欧美黑人大吊| 国精产品久久| 久草A片| 五月婷婷在线免费观看| ..真实国产乱子伦毛片| 大香蕉中文| 99热超碰在线| 十月丁香九月婷婷综合| 激情小说五月天| 国产JK精品白丝AV在线观看| 96色婷婷| 婷婷久久婷婷色五月| 99在线观看视频蜜臀| 丁香五月,激情五月,深爱五月| 欧美va欧美va差| 色99色| 深爱开心激情| 丁香六月av| 超碰在线观看99| 夜夜噜夜夜奇| 色综合色五月| 91seAV| 人妻中文在线| 激情綜合W W W,激情五月天| 五月天色社区| 九九久久高清| 丁香五月天BBw| 亚洲第一综合| 97日本在线播放| 人妻视频在线| 色婷婷视频综合| 99久久综合网| 成人短视频免费| 久er免费视频| 亚洲婷婷五月| 国产高清视频91九九九久久久| 色色激情网| 天天干天天操天天上| 99热97| 99自拍视频| 九九久99免费视频| 五月天自拍网| 狠狠色丁香| 成人免费高清在线播放| 亚洲欧美一区二区三区爱爱动图| 青草视频在线播放| 丁香六月色婷婷欧美| 婷婷五月视频| 五月婷婷亚洲天堂97色婷婷| 丁香六月天AV| 五月天色综合| 久久久婷婷婷| 日本久久婷婷| 中文在线成人| 99er精品视频| 久热A片| 人人草公开操| 五月婷婷AV| 91主播在线| 可以免费看av网站| 香蕉久久国产AV一区二区| 丁香五月综合无码趴趴| 婷婷五月天高清无码| 性做久久久久久久免费看| 任你爽精品免费视频6| 视色综合| 玖玖婷婷色欲| 五月色丁香激情| 六月激情婷婷| 精品国产va久久久久| 色五月婷婷老师| 丁香综合| 久草xx性爱视频| 欧美色频| 精品久久人妻热| 99ri在线视频| 99热综合| 日本久久精品| 青青草搞屄视频网站| 久久婷婷激情| 五月天激情国产综合婷婷婷就去爱| 五月丁香综合| 99热大香蕉| 五月天婷婷丁香导航| 日韩不卡123| 色六月丁香婷婷狠狠干| 丁香六月婷婷色XXXX| 精品婷婷五月视| 日本狠狠色| 色5月婷婷| 久色网址| 婷婷五月天伊人在线| 国产成人99久久亚洲综合精品| 极品色丁香| 丁香五月激情网| 夫妻超碰在线| 碰碰91| 色综合区| 免费无码毛片一区二区A片| 丁香亭亭久久| 久9综合| 丁香婷婷六月在线资源观看| 婷婷丁香www视频日本韩国| 婷婷五月天国产| 激情 婷婷| www.91婷婷| 欧美性猛交99久久久99| 激情六月婷婷| 丁香六月天之亚州热女| 久99热在线观看| 啪啪综合| 青青草蜜臀| 五月丁香色停停啪啪啪| 日日夜夜天天| 丁香五月98| 日日操日日撸| 五月婷在线| 激情视频网址| 大陆肏屄视频| 五月天激情图片| 婷婷综合五月天| 丁香丁婷五月激情| 天天肏在线视频| 狠狠草狠狠草| 久热这里只精品| 777精品久无码人妻蜜桃| 就爱干 在线| 182.t午在线观看| 婷婷五月天六月丁香| 天堂在线9| 99精品热| 开心网五月色婷婷| 伊人婷婷青青cao| 亚洲欧洲中文日韩久久AV乱码| 亚洲婷婷五月天激情综合| 97干在线免费| 五月激情六月综合| 精品久久久人妻| 亚洲操逼片| 色狠狠色噜噜AV天堂五区| 91精品久久久久久综合五月天| 97操碰视频| 欧美槡BBBB槡BBB少妇| 台湾佬天天日丁香婷婷五月天| 婷婷五月综合色中文字幕| 婷婷激情社区| 色综合色色色| 99热青青草原| 色五月丁香六月资源站| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 国产欧洲欧洲精品久久| 丁香婷婷深情五月亚洲| 6月丁香婷婷激情| 人人看人人97| 亚洲九N| 一区二区免费看| 国产日批视频| 日本一道久久| 91九色欧美| 开心五月激情网| 综合久久五月天| 蜜臀A∨在线水帘洞| 超级碰 久久9| 成人无码髙潮喷水A片| 这里只有精品在线视频在线观看| 五月丁香六月婷婷中文版| 婷婷久久伊人| 婷婷丁香五月基地| 成人在线观看精品| 丁香五月综合| 久久六月综合| 97综合在线| 亚洲bt丁香五月天婷婷激情小说| 五月婷婷色丁香| 色婷婷狠| 91人人澡人人爽人人看| 冬月かえでAV无码播放| 青青草99re| 婷婷五月花| 色九月婷婷综合| 婷婷六月五月| 思思久久99热只有频精品66| 深爱开心五月天| 色情婷婷| 超碰久热| 婷婷五月天国产精品| 久久九九婷婷| 久久婷婷的综合色丁香五月| 99精品综合在线| 国产精品一区在线观看你懂的| www.婷婷六月天| 色天五月天在线观看视频| 婷婷成人综合五月| 五月激情丁香五月宗合| 无码一区二区日韩| 丁香五月婷婷少妇| 色五月成人婷婷| 午夜激情婷婷| 日韩色色色色色| 色情久久久| 9九色首页| 日本免费91| 色九综合| 影音先锋天天日| www网站在线观看| 麻豆AV一区二区三区| 色玖玖| 五月天桃色深爱网| 午夜天堂一区人妻| 久cao香蕉影院| 中文字幕日本最新乱码视频| 伊人久久丁香五月91| 国产又爽又猛又粗的视频A片| 久久9视频| 五月丁香综合| 激情婷婷丁香五月| 久久婷婷大香蕉| 免费成人中文字幕| 亚洲啪视频| 五月丁香另类图片| 久久这有这里精品| 草做免费在线观看| 超碰人人99| 色爽九九| 激情小说在线视频| 9久热精品在线视频| 九九热青草| se色婷婷视频| 丁香操逼| 99热在线资源| 丁香五月在线伊人| 人妻尝试久久久久久久久久久久| 思思热精品在线| 国产熟女大叫受不了| 人人妻人人澡人人爽| 九九九九大香蕉| 久久丁香五月| 丁香五月激情综合在线观看| 日日夜夜爽| 婷婷五月丁香综合激情| 久久婷婷六月综合| 狠狠爱深色婷婷综合| 91人久| 婷婷五月综合中文字幕| 久久婷婷五月综合伊人| 亚洲综合网激情小说| 五月花丁香婷婷| 婷婷另类小说| 久久99热这里只频精品6学生| 男同91| 五月丁香婷色| 激情五月图| 99爱免费视频在线观看| 丝袜人妻| 99色综合久久| 91丨九色丨东北熟女| 婷婷五月婷婷五月天| 丁香五月天AV| 色停停五月天| 五月激情视频| 91久女| 91狠狠色丁香| 久热这里只有精品99re,久热这里只有精品7| 丁香五月天成人| 成人网在线视频| 精品一区二区三区四区五区六区| 另类亚洲视频| 五月色丁香激情| 五月天激情四射网站| 亚洲中文字幕网| 婷婷五月天大香蕉在线视频观看| 激情婷婷五月久久| 丁香六月婷婷| 欧美日韩婷婷五月天| 五月天天堂久久| 狠狠干总合| 色婷婷AV在线| 免费色婷婷| 丁香五月天堂网| 五月婷婷九| www.婷婷亚洲基地| 丁香婷婷综合色五月激情国产基地| 亚洲精品无码久久| 99热国产这里只有精品| 偷偷与邻居做爰完整视频| 五月丁香偷拍| 九九人人精品| 婷婷五月天激情丁香| 九九久久网| 久久无意婷婷| 亚洲色欲AAAAAA| 五月综合色| 五月婷婷婷色| 五月天激情小说婷婷基地| 色色五月婷婷| 色五月婷婷综合在线| 婷婷五月天熟妇| 狠狠爱综合网| 99九九综合久久九九| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 婷婷中文字幕| 五月天色播网| 大香蕉婷婷| www.射伊蕉婷婷| 久久思思热视频| 婷婷五月天综合网| 香蕉婷婷色五月| 亚州操操| 婷婷五月天激情电影| 天天综合网亚洲网站| 丁香五月天视频| 91久久久久久久久18| 五月天六月丁香| 97极品在线| 五月婷色丁香| 97 A I色色| 91久久网站| 五月天婷婷在线啪啪视频| 五月婷婷婷婷| 天天爽天天爽天天爽天天爽天天爽| 九热免费视频| 色婷婷五月在线| 婷婷六月综合激情| 五月天激情网址| 日日夜夜天天综合| 婷婷五月娱乐在线| 五月婷婷六月丁香综合| 大香蕉久久久久久久久| 五月六月婷| 亚洲视频另类| 欧美丁香婷婷五月| 超碰99热精品| 色六月婷婷| 五月丁香激情四射| 另类小说五月天| 91超碰在线观看| AV在线观看网站| 国产97色在线 | 日韩| 丁香婷婷五月天网站| 另类小说五月天| 久久婷综合| 丁香成人五月天| 午夜婷婷| 免费观看18视频网站| 婷婷五月天,影院| 国产一区二区三区影院| 无码人妻一区二区三区免费九色| 精品九九九久| 色色a| 色播播婷婷| 五月婷婷中文字幕| 五月婷六月综合在线观看| 五月大香蕉| 色婷婷成人影片| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 伊人久久婷婷| 99精品久久久久久久婷婷久久| 噢美99| 亚洲成人噜噜| 日韩人妻在线观看| 噼里啪啦完整版中文在线观看| 激情五月天综合图片小说网站| 91男女视频在线观看| 综合色激情| 久久综合影院| 婷婷97狠狠成人网站| 丁香婷婷在线| 亚洲愉拍99热成人精品| 久久精品一区二区三区四区| 思思热99热| 五月丁香婷婷久久| 免费超碰在线观看| 九九热大香蕉| 99热这里只有精品33| 99情色五月天| 九九av| 伊人丁香五月| 欧洲S级在线观看| 思思99热| 79精品视频在线观看,| 婷婷综合五月天| 风流少妇A片一区二区蜜桃| 五月丁香婷婷俺| 久热 91| 婷婷天天婷婷天天澡| 91成人电影| 狠狠精品干练久久久无码中文字幕| 欧美天天干天天草| www.99在线| 久久九九激情五月天| 婷婷娌伦网| 亚洲色婷婷色| 91狠狠色丁香| 婷婷丁香精品视频在线观看| 色色色热| 激情图片婷婷丁香五月| 五月丁香久久丝袜啪啪| 五月丁香六月激情综合网| 超碰cap| 五月丁香六月婷| 日本欧美国产| 亚洲视频在线观看99| AV免费在线网站| 99色婷婷| 99久久网站| 天天爽综合网| 丁香五月天婷婷久久综合| 久久婷中文字幕| 97高清国语自产拍| 五月激情六月宗合| 99久精品视频| 丁香五月婷婷六月| 免费试看小视频 99| 久久婷婷啪啪视频| 97男人天堂| 国产精品人成A片一区二区| 色婷婷电影网| 婷婷激情五月天小说校园| 丁香五月激情天AV无码| 生活片五区| 五月深情久久| 日本三级成人秘书精品片| 激情综合婷婷| 97极品在线| 色情综合网| 免费99情趣网视频| 亚洲激情综合| 国产五月天婷婷| 国产亚洲99久久精品熟女| 99热久久这里只有精品| 婷婷五月情| 日本久久婷婷| 色婷天天| 成人欧美日韩| 另类A片| 婷婷五月天成人| 5月婷婷激情网| 色久五月| 色综合性视频| 五月婷婷少妇之| 五月丁香激情片| 亚洲成人AV在线观看| 狠狠久综合| 婷婷五月另类网站| 欧在线一区| 超碰熟女农村在线69| 日韩成人无码| 9久热精品在线视频| 午夜不卡久久精品无码免费| 亚洲中文字幕在线观看| 色综合五月天| 五月天开心网| 亚洲乱码日产精品BD| 激情丁香五月| 97精品人人A片免费看| 伊人色综合网| 日本人人超碰| 婷婷狠狠青青| 九九99在线视频| aaaa.黄| 一级七香蕉| 激情性爱网站| 99日本在线| 中文字幕在线日亚洲9| 啊V视频在线观看| 97干在线视频| 五月婷婷新网站| site:pzdcoin.com| 丁香五月天欧美| 色小说五月婷婷| 激情五月天婷婷色色色色色色色色色色色 | 婷婷五月激情在线| 婷婷五月丁香香蕉| 玖玖爱综合网| 婷婷视频网| 99热官网| 亚洲123区高清入口| 激情婷婷视频在线| 色婷婷久久综合| 一起草无码视频| 六月婷婷无码观看| 五月丁香婷婷潮喷中文字幕| 综合婷婷五月天| 97视频久久| 久久曰曰| 婷婷五月综合丁香久久| 亚洲综合一区二区| 99热热九九| 五月色婷婷激情| 伊人在线视频| 伊人久久艹| 五月天丁香婷婷视频网址| 色爱综合五月| 婷婷丁香69精华| 深爱激情五月天色婷婷| 五月天综合久久| 狠狠操狠狠爱| 91午夜婷婷狠狠久久综合9色| 熟女国产在线一区二区三区四区| 久久激情综合| 五月婷婷自拍视频| 色五月激情综合网| 激情性爱五月天网页| 五月婷婷九九热| www.激情五月天。com| 五月婷婷丁香五月婷婷| 99热老司机| 四川女人毛多水多A片| 色婷亚洲| 丁香五月98| 9九色首页| 国产午夜精品AV一区二区麻豆| 大香人妻| 五月婷婷色丁香| 五月丁香影院| 99热个人在线| 综合色99| 婷婷五月天在线一区| 六月婷婷色综合| 色婷婷91激情小说| 丁香婷婷六月婷婷六月婷婷六月婷婷| 亚洲99热| 欧美韩国日本| 国产 亚洲 在线| 狠狠色综合网站| 综合色99| 午夜色丁香| 天天摸天天舔天天爽| 天天综合色| 亚洲精品又粗又大又爽A片 | 97在线刺激| 亚州性爱99| 99激情视频| 啪啪五月综合| 情涩婷婷五月天| 99色热| 激情av在线| WWW.99热| 少妇人妻丰满做爰XXX| 五月天激情影院| 激情五月天影院| 97色五月婷婷在线| 亚洲五月天综合色| 久久久激情视频| www.爱婷婷.com| 丁香五月六月婷婷自拍| 超碰av在线| 艹天天射| 婷婷色色欧美| 欧美日本不卡黄色片| 丁香婷婷丁香五月欧美人| 99爽视频| 五月 激情视频| 日本久久爱| 婷婷五月丁香第四色超碰在线| 丁香五月婷婷无码AV| 午夜爱爱网站| 久久综合影院| 日日日日日| 99视频极品在线香蕉| 婷婷色五月情| 激情久久伊人| 99热只有精品在线观看| 日本欧美成人片AAAA| 久久草人妻| 97色在线| 激情综合啪啪啪| 欧美在线视频99| 丁香婷婷五月激情| 久久精品9| 91九色无码内射| 天天操综合网站| 激情综合网激情五月俺也去| 丁香五月23111| 五月婷婷色在线| 丁香六月色情| 无码少妇高潮喷水A片免费| 日本婷婷综合精品| 538在线精品| 热99热| 国产精品第一国产精品| 久久五月天激情视频| 国产熟妇乱子伦hd| 天天天天天天噜| 中文婷婷狠狠| 婷婷六月天激情| 五月丁香久久呀| 99热日韩| 激情综合青草| av高清无码| 性天天中文网| 色五月大| 丁香六月啪啪| 婷婷五月天xxx| 久久久久久久久久久-久五月天婷婷| 国产99视频永久免费| 精品一区久热| 色五月综合| 婷婷色丁香五月| 99这里| se99在线| 丁香五月 激情文学| 99操无码视频观看| 丁香亭亭久久| 好吊兆人妻| 国产欧美va| 精品在线网站| 成人无码髙潮喷水A片| 五月天堂在线| 综合性爱网| 色五月天综合网| 色情丁香五月天| 大香蕉太香蕉视频97| av在线免费网站| 五月丁香婷婷潮喷中文字幕| 成人婷婷五月天| 色综合激情| 丁香激情五月少妇| 激情综合99| 日本三级日本三级三级人妇四虎| 激情综合一| 五月婷婷综合色拍| 偷拍九九五月丁香婷婷| 人妻久久久| 在热视频精品| www婷婷| 青青草免费公开视频| 深爱五月网| 黄网网站在线播放| 六月五月天婷婷涩播在线| 五月天婷婷激情| 天堂成人A片永久免费网站| 五月婷婷六月开心| 成久综合视频| 久久久人人操A V| 色久天| 五月天久久丁香| 大香蕉五月丁香| 热久久999| 97人人操人人爽| 激情宗合网激情五月天| 99ri在线| 色停停影院五月天| 国产激情综合五月久久| 亚洲人人操| www.五月天婷婷姐姐| 男人天堂99| 1024欧美看片| 色婷久久| 亚洲操精品| 日韩精品无码99| 这里只有精品偷拍| 男人的天堂97| 亚洲综合色成丁香五月色| 亚洲天堂99| 国产午夜一区二区三区| 五月丁六月香av| 97操在线视频| 午夜日日| ai97re99一本| 99在线精品视频| 亚洲综合视频网| 久热A| 五月丁香久久久日婷婷久久婷婷日| 午夜九九九九九九九九九九九九九| 五月丁小婷婷激情四射| 99超级碰免费视频| 久99热| 丁香五月天堂网| 五月天激情子轮| 日本人妻丁香婷婷久久寝取熟女五月| 色色色综合色| 老妇操B| 996黄色片| 九九九九九999999| 中文字幕日产A片在线看| 91久久久久久| 亚洲啪啪视频| 婷婷中文字幕网| 国产婷婷五月色情综合| 五月丁香亭亭天天舔| 色色色精品无码区| 亚洲综合网区| 99热精品在线| 91狠狠色| 人人操91| 丁香婷婷性爱| 粉嫩av懂色av蜜臀av熟妇| 丁香五月婷婷亚洲色图| 免费人人操| 人妻中文字幕网| 操操操91| 美女伊人久久| 四季AV综合网| 欧美性久| 狠狠爱婷婷爱| 国産精品| 99精品热| 亚洲综人色综网| 天天久久66xxx| 五月婷婷在线丁香| 久热精品视频在线观| 色色五月婷| 精品久热| 在线va网站| 丁香五月综合久久八| 婷婷五月天堂网| 婷婷六月丁香开心深深爱| 只有精品在线观看| 天天插综合在线| 天天草天天舔| 天天草天天日| 五月婷婷六月丁香色| 伊人五月综合网| 欧美色97| 大香蕉啪啪啪| 成人在线视频网| 福利视频在线播放| 熟女色色一区二区| 九九综合九色欧美狠狠| 9久久网| 伊人综合色干| 99自拍视频在线观看| 国产五月丁香在线| 亚洲色小说在线综合| 欧美草久久五月天91| 99精品热| 色婷婷综合网| 成人无码精品1区2区3区免费看| 色婷婷激情Av久久久| 欧亚中文A V| 色婷久九| 538在线| www.色擼擼.com| 六月丁香网| 五月激情综合网| 婷婷五月天激情网| 色综色网| 97碰碰在线观看视频| 久久丁香五月天| 99色热视频| 五月丁香啪啪网| 亚洲成人在线播放| 综合色色五月| 婷婷五月激情的图片| 丁香五月婷婷啪| 激情六月婷| 特黄三级片| 无码免费人妻A片AAA毛片西瓜| 色婷婷aV四虎| 成人电影一区| 久久99色色| 激情久久久久久久久久久| 大香蕉九九| 色丁香五月婷婷综合久久| 丁香花五月天激情| 五月丁香色婷婷基地| 欧美性爱中文字幕| 中文字幕乱码亚洲精品一区| 啪啪东京热| 韩国情人在线电视剧免费观看高清版全集 | 色色色色色色色色网站| 亚洲情综合五月天| xx久久| 五月婷婷综合色啪首页| 96精品久久久久久久久| 嫩草AV久久伊人妇女超级A| 91av视频在线观看最新网址| www,8050,午夜三级| 激情伊人五月天| 激情五月天色色网| 毛v一区二区视频| 久久6这里只有精品| 九九热这里只有精品6| 五月综合激情网| 超碰爱爱爱| 九月婷婷丁香| 五月婷婷六月丁香在线| 丁香色影院| 色色丁香五月婷婷| 超碰91在线| 丁香五月 无码| 高清激情av在线观看| 激情五月色婷婷| 九九艹女| 五月天婷五月天综合网在线观| 久草狼人| 另类婷婷五月天啪帕帕| 99re这里只有精品免费| 在线观看中文字幕亚洲| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 超碰免费大香蕉| 日日夜夜小色哥| 九九亚洲| 玖玖国产视频一区| 久久9精品视频| 丁香五月婷婷影院| 色色网站免费观看| 激情小说五月天| 黄色AV日韩| 婷婷综合一二三| 五他月天啪啪啪| 99热这里只有精品2024| 婷婷五月天av| 99久久精彩视频。| 亚州色婷婷| 超碰在线99热| 色色色色色色网站| 五月婷婷欧洲| 婷婷丁香五月欧美人| 嫩草AV久久伊人妇女超级A| 亚洲激情网| 99热9999| 97人人操| 亚洲综合草草| 香蕉久久国产av一区二区| 99久在线精品99re8热| 五月 婷 久| 99re在线这里只有精品视频首页| 亚洲色无码A片一区二区麻豆| 深爱五月婷婷开心中文字幕| 久久久精品色| 婷婷天堂综合| 精品久久99码| 婷婷永久在线| 五月丁香婷婷综合| 中文字幕在线免费观看视频| 大香蕉五月婷婷| 丁香六月婷婷综合欧美| 色婷婷电影网| 婷婷色五月天色| 五月激情站| 色一情一乱一乱一区9| 色99在线观看| 激情熟女网| 色婷婷久久综合中文久久一本| 99操不停| 激情综合五月开心狠狠| 99在线热视频| 五月丁香激情四射| 欧洲亚洲免费视频9| 五月丁香影院| 婷婷五月天成人娱乐| 婷婷五月色| 精品人妻久久久| 欧美熟女视频 色婷婷| 激情五月天激情综合网| 9 1 A v久久久| 五月香婷婷| 激情六月丁香| 激情五月激情综合网| 激情五月综合免费| 人碰人人人玩91| 噜噜色婷婷| 婷婷五月天黄色网址| 日本啪啪天堂| ss五月天激情| 综合色色五月| 五月天开心婷婷激情网站 | 丰满女老板BD高清A片| 久久99久久99精品免观看软件| 久久99草五月婷婷| 99综合| av在线资源| 激情五月丁香五月| 天天影视色综合网| 97爱综合| 欧美日韩一区二区三区四区| 狠狠88综合久久久久噜噜噜| 亚洲黄色网址| 日日操夜夜撸| 激情综合5| 乱乱av| 天天操综合网| 天天操夜夜爽天天操| 夜夜操加勒比| 伊人激情影院| 色婷婷黄色网络| 婷婷丁香综合网| 激情五月婷婷| 青青热久久综合| 六月婷婷操逼| 思思热在线播放| 亚洲VA在线| 亚洲久久日| 色综合天天| 婷婷五月深深爱| 五月丁香无码| AⅤ网站在线看| 婷婷六月色开 | 久久ab| 国产性色蜜乳| 五月丁香久久呀| 香蕉久久av一区二区三区| 亚洲国产精品VA在线看黑人| 久久中文人妻系列| WWW久久99久久99久久| 日韩九区| A久网| 91超碰人人操| 无毒黄色网址| 天干夜夜操| 婷婷色激情五月天| 国产99美少妇| 色婷婷影| 9热网站| 色综合com| 毛片毛片毛片毛片| 色色精品色| 婷五月天六| 日本欧美成人片AAAA| 色情五月天丁香社区| 国熟女视频| 色噜噜狠狠色综合网| 亚洲超碰青涩| 91九色在线| 久久99大全| 99热亚洲精品66| 狠狠操之狠狠操| 啪啪黄页网| 97综合视频在线| 夜夜骑夜夜操| 九月婷婷激情| 婷婷久久亚洲| www.日日日.com| 最新色色五月天| 日韩啪图| 国产婷伊人| 激情综合婷婷| 日本久热| 日日操夜夜爽| 婷婷丁香在线播放| 天天做天天要天天爽| 五月丁香| …亚洲黄色在线播放日韩、av中文a…| 久草婷婷网 | 五月丁香婷婷综合网| 91亚洲免费片| 97操资源婷婷| 人妻丰满精品一区二区A片| 青草激情综合| AV在线免费播放| 舔色婷婷| 婷婷久久亚洲| 五月婷婷狠狠干| 五月青青草综合| 99久久99视频只有精品| 99日本黄站| 新激情综合| 久久五月天丁香| aaa久久久| 青草青草视频2免费观看| 欧美性爱五月天| 中文字幕在线免费观看视频| 九九热最新| 色欧洲| 99热这里只有精品3| 色婷五月| 激情都市五月天| 婷婷丁香六月激情综合| 久久ER视频com| 思思99热在线| 人人玩人人橾| 五月天天天综合| 五月天婷婷激情网| 日本综合久| 丁香五月婷婷激情小说| 九九热AV| 日本色频| 婷婷欧美激情综合| 第四色五月激情网| 免费的日逼视频| 婷婷激情综合无月| 激情丁香淫荡婷婷| 五月天色婷婷小说| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 蜜桃婷婷丁香综合久久开心亚洲| 777精品久无码人妻蜜桃| 性做爰A片免费视频A片直播| 久久久国产精品黄毛片| 丁香婷婷五月份| 丁香五月亚洲综合| 在线91日韩| 另类亚洲视频| 激情综合网五月丁香| 久月婷婷| 天天日天天狠狠操| 婷婷五月开心中文字幕色| 狠狠操在线视频| 开心五月色婷婷综合开心网| 激情五婷网| 五月天伊人久久久久| 任我肏| 99这里有精品| 一本大道伊人AV久久综合| 91综合视频丁香| 色欧美日| 天天色天天射天天日| 色婷婷丁香网| 九九九成人在线视频| 日日日日操| AV成人在线播放| 色婷婷综合网| 国产精品涩涩涩视频网站| 五月婷婷性爱网| 开心五月婷婷婷美女| 日本99视频| 国产日日夜夜操| 四色五月婷婷在线观看| 欧美天堂久久| 色综合色色| 影音先锋91在线资源站| 日韩 mm 不卡| 欧洲毛片基地c区| WWW.桔色成人.COM入口| 久久婷婷综合五月趴| 色婷婷综合久久久久| 国产人妻777人伦精品HD| 2015在线中文字幕| 中文资源在线a| 欧美性丁香色色五月天综合爱爱| 亚洲亚洲亚洲AAAAAA| 久久久99视频| 免费看欧美成人A片无码| 偷拍99在线视频观看| 超碰91av| 亚洲色色色色| 五月激情网站| 风流少妇A片一区二区蜜桃| 色站9/| 热99精品视频在线观看| 成人五月天视频播放| 色色色色综合网| 九九9久九9国产视频| 视频1区2区| 99热6这里之有精品| 婷婷五月天色| 思思热在线观看| 亚洲婷婷综合视频| 日本激情ⅩXX免费视频| 99热精品中文字幕| 激情丁香婷婷| 色噜久| 亚洲尤物在线| 亚洲婷婷基地| 精品人妻在线免费观看| 99九无网码| 五月婷婷综合色啪首页| 欧美日韩成人在线观看| 国产精品久久久爽爽爽麻豆色哟哟 | 天天射综合网天天插| 九九自拍网| 欧美婷婷丁香社区在线播放| 婷婷亚洲综合| 丁香五月六月婷婷怡红院| 亚洲va综合va国产va中文| 国精产品一区二区三区| 五月婷婷就去色| 成人版视频在线观看| 日韩av手机在线观看| 九九在线免费观看| 超碰在线国产| 天天操天天操天天操天天操天天操天天操 | 五月激情综合网| 亚洲成人AV在线| 午夜青草资源| 97精品综合| 久热9热| 99热99免费| 狠狠干在线| 国产精品色婷婷久久久精品| 国产高清RV综合aVa| 天天影院色| 991国产精选视频在线播放下载| 婷婷综合网站| 超碰人人在线| 在线另类视频| 婷婷婷婷婷婷婷婷| 99久久超级| 天天色爽| 狠狠做深爱婷婷久久综合一区| 午夜色丁香| 五月天婷婷视频30| av国产精品| 性一交一乱一交A片久久四色| 五月天综合在线观看视频| 国产黄色在线观看| 日韩无码一区二区三区四区| 超碰99热| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 玖玖在线视| 丁香久久九九99| 丁香婷婷中文字幕| 中国女人做爰A片| 亚州激情网站无码| 99性色| 亚洲激情av| 大香蕉天堂| 99热在线资源| 久久精彩视频| 9久热在线精品| 深爱激情69热| 婷婷激情久久| 久久久99精品| 日韩在线看AV| 69激情小说| 色一情一乱一伦一区二区三区| 五月激情婷婷图片基地| 天天日,天天插| 超碰久热| 丁香色婷婷| 色香蕉影院| 99精在线| 久久婷婷五月综合97色一本| 激情综合色| 婷婷丁香五月天综合AV| 可以直接看的av| 亚洲国产精品成人免费一区久久久在线观看AAAA | 丁香五月六月久久综合| www.久久久久| VA国产在线综合网站| 开心五月深爱五月| 亚洲色婷婷婷婷人人爽| 在线观看国产高清视频免费网站 | 久久66精品| www.夜夜爱.com| 五月天伊人综合| 狠狠色九月| 97九色视频| 97久久久久| 六月丁丁香| 好好日激情五月天| 丁香五月激动深爱欧美| www久热com| 九月大香蕉| 棕合影院色色| 九九99在线免费在线观看视频| 天天天天干| 亚洲色情激情丁香五月| 天天干在线播放| 色婷婷www| 69久久99精品久久久久婷婷| 丁香色色网| www久久五月com| 国产午夜成人免费看片无遮挡| 九九色热视频| 99热插| 这里只有精品1| 天天天天天操| 69人人操人人爽| 成人 视频免费观看网站| 六月丁香婷婷五月天| 香蕉人妻AV久久久久天天| 26uuu另类亚洲欧美日本一| 超碰高清在线| 五月丁香黄色视频| 26uuuu精品一区二区| 婷久久综合| 亚洲人妻av| 色色日韩无码| 怡红院91a√| 人妻久久久久久久| 国产精品久久久60086| 天久久久久| 欧美性爱五月天| 婷婷五月天激情五月天| 色五月婷婷91| 欧美人与性动交CCOO| 五月婷在线视频免费看| 婷婷的99视频网站| 极品人妻VIDEOSSS人妻| 这里只有精品无码| 婷婷五月天AV网| av不卡网站| 九热视频| 婷婷综合五月色播| 欧美视频五区| 亚洲精品国产A久久久久久| 五月天六月色| 第四色五月激情网| 激情淫乱男女| 超碰人人在线| 中文AV网| 南京搡BBBB搡BBBB| 五月天综合久久丁香91| 熟女少妇内射日韩亚洲|