Linux內核性能剖析的方法學和主要工具

Linux閱碼場 2022-12-07 08:00


計算機科學的先驅Donald Knuth(高德納)曾經說過:“過早的優化是萬惡之源”,更詳細的原文如下:“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified.”它向我們揭示了一個道理,我們應該首先定位到那3%真正成為瓶頸的代碼,而忽略97%那些“small efficiencies”,所謂“將軍趕路,不打小鬼”,這是我們進行一切性能優化的前提。因此,剖析(profiling),成為了性能優化中最重要的環節之一。


性能剖析,要求我們的思維方式主要是top-down的,我們能全局地從頂部向下的看問題,這就像一個全科醫生,出了問題后,能大致估摸出一個方向知道是哪個器官可能出了問題。但是,我們同時也必須具備down-top的能力,正如一個??漆t生,能看到細小器官的癌細胞最終會怎樣向全身發散,從而危機到人的健康和生命。


系統的性能優化不太是一個通過review幾千萬行代碼,發現問題,然后更正問題優化的過程。而更多是一個通過某些剖析手段,把系統當成黑盒子,暴露數據,top-down地看這個系統,在發掘問題后,再深入到白盒down-top的過程?!段郝浴吩唬骸傲猎谇G州,以建安初與潁川石廣元、徐元直、汝南孟公威等俱游學,三人務於精熟,而亮獨觀其大略?!毙阅軆灮旧恚且粋€從統帥諸葛亮逐步變身單兵戰神呂布的過程,而你首先必須是統帥。



一、性能剖析的總體認識



下面我們也來一個“觀其大略”的環節,先“不求甚解”地看一看內核性能分析關注的指標,分析角度和一些其他基本常識。


吞吐

吞吐強調單位時間里可以做多少有用功。比如,我們會用netperf來評估網絡的帶寬;用sysbench來評估MySQL的QPS(Queries Per Second)和TPS(Transactions Per Second);用vm-scalability來評估Linux內存管理的吞吐性能等;用tbench來評估內核調度器wake-up路徑上的優化是否有效等。


為了提高吞吐,我們常常采用的一個方法是橫向拓展硬件或者軟件的規模,比如增加更多的CPU、使用多線程等。然而世間萬物,不如意者十之八九,不是你愛她多一點,她就一定會愛上你。吞吐的拓展受限于著名的Amdahl's law和Universal Scalability law(USL)。


按照USL,核多(核數為p),實際的加速倍數是:



p增大的時候,不僅僅是分子增大,分母也增大,分母σ因子隨著p線性增大,k因子隨著p的平方線性增大。USL的分母中去掉+k*p*(p-1)就是Amdahl's law,所以Amdahl's law并沒有USL完整準確。


其中的σ系數是contention(核間、多線程間因為競爭等鎖、同步等而不能并行執行),k系數是coherency(核間、多線程之間的協同形成共識的開銷)。σ系數比較好理解,比如兩個CPU訪問同一個鏈表,他們需要競爭鎖,假設平均1秒里面0.1秒在等鎖,則2個cpu實際只有2*0.9=1.8秒在做有用功,而不是2.0。k系數相對難理解一點,比如我們在CPU0釋放一個spinlock,在ticket spinlock里面,這個spinlock的新值要通過cache同步網絡同步給系統的每個CPU形成所有CPU對這個新值的一致性理解,這個cache同步的開銷很大,而且隨著p的平方而增大。這就是為什么內核針對spinlock不斷在進行優化,比如從ticket spinlock變成qspinlock,其實是減小了需要coherency的CPU個數。



舉一個栗子,軟件的童鞋很可能會天真地以為內核的atomic_inc()、TLB flush之類的操作是非常便宜的,其實它們都有嚴重的k因子問題,就是coherency開銷。如果做一個簡單的操作:

lcase A: 100核,100個線程同時做atomic_inc(),做一秒鐘;

lcase B: 10核,10個線程同時做atomic_inc(),做一秒鐘。


case A原子操作的次數不會是case B的10倍,它實際遠小于10倍,比如實測結果可能是嚇死你的4倍(當然每個具體的SoC都可能不一樣),等于10倍的硬件目前這個世界還沒有做出來,未來也造不出來。


這些σ系數、k系數對服務器的影響,遠大于對桌面和手機等系統,因為服務器上的p特別大。所以,長期困擾服務器的問題,比如我從50個cpu變成100個cpu,MySQL的吞吐一定增加了一倍了嗎?不好意思,很可能只是嚇死你的1.3倍,如果運氣不好的話,還可能倒退。


再回到spinlock,大量的文獻顯示,由于ticket spinlock等在核間coherency上的巨大開銷,許多業務的性能可隨著CPU核數量的增大而減小【1】。



最開始核增加的時候,相關業務的性能在提升,到某個拐點后,再增加更多的CPU,性能不升反降,出現了collapse。


延遲

甲骨文的“山”,是一個象形字,它較好地貼合了Linux世界里的延遲模型。Linux世界的延遲往往呈現為這種multi-modal(有多個峰值而不是只分布在一個峰值周圍)或者兩極分化特性。



由于這種multi-modal分布的存在,這個時候,我們描述平均值的意義其實不是特別大。比如一個班上有30個學生,其中10個人90分以上(學霸),還有10個人50分以下(學渣),另外還有10個在50-90分之間。我們說這個班的學生平均分60分,其實沒有任何意義,拉馬老師來和我們平均,沒意思的。這個時候,我們需要直方圖來描述這種分布,從而更加直觀地看出來這個班的學霸和學渣比率。



如果我們想看一個真實的Linux例子,下面是我的PC在運行“sudo cat /dev/nvme0n1 > /dev/null”的過程中,我看到的BIO(block I/O)的延遲分布:



我們看到了2個峰值,一個峰值在64us-127us之間;另外一個峰值,則圍繞著1024-2047us分布。當然,還有一個值會偏移地特別遠,比如有2個采樣點,落在了131072us-262143us之間。那2個離群很遠的值,我們一般也稱呼它們為outlier,它們是夜空中最閃亮的星,天生不是凡人。


種種跡象表明,我們僅關注平均值的意義非常有限。對于偏移中線的部分,在延遲分析領域,我們還特別關注一個非常重要的概念,tail latency,中文可譯為尾延遲。比如我們說,90%的延遲落在1ms以內,99%的延遲在10ms以內,但是還有1%的延遲可能更大,甚至形成一個很長很長的尾巴,可能有的達到了1秒也說不定。在延遲分析領域,我們很可能關注這些尾部,比如大家一起競爭mutex,那些延遲很大的case,可能會形成手機系統的卡頓,因此丟幀。對于服務器、電商、云服務等領域而言,高的尾延遲,會直接影響到企業的revenue。



延遲的幾個主要可能的來源:

1.進程實際可以運行(TASK_RUNNING),但是由于調度延遲的原因搶不到CPU;

2.進程同步等待一個I/O動作的完成,這些I/O動作可能是syscall的read/write,也可能是mmap內存page fault后的I/O;

3.系統內存吃緊,進程陷入direct memory reclaim,直接回收內存;

4.進程等其他進程釋放鎖,這里又分2種可能性

a.等鎖隊列比較長,比如等mutex、spinlock,前面已經掛了一個連在等,等到自己的時候,心已經碎了;

b.等鎖隊列可能不長,但是持有鎖的進程遭遇了情況1、情況2和3,導致長期不放鎖。類似你在等廁位,他卻坐馬桶上看了場電影。


所有的上述不確定情況,都可能形成不確定的tail latency。我們需要某些手段把它剖析和呈現出來。


功耗

內核有cpufreq, cpuidle,意識到功耗的調度器等。這些都致力于在降低功耗的情況下,總體不降低性能。除這些以外,我們也應該認識到,降低內核本身的CPU利用率,比如內存compaction、內存swap/reclaim、鎖自旋等的開銷,也能進一步降低功耗。在一個內存受限的系統中,我們不能低估內核本身的開銷所引起的功耗增加。


比如,我在 qemu上ARM64 Linux-5.19-rc2內核,然后運行下面簡單的程序:



這個程序申請了1GB內存,然后fork出來64個進程,其中最原始那個父進程不停讀寫這個1GB的內存。代碼gcc編譯結果a.out。系統的內存是900M,并開啟了zRAM交換功能。運行起來后,我們看它的CPU消耗,a.out固然是很大,可是kswapd0這個內核線程也是非常大的CPU占用。



kswapd0相對我們的有用功a.out,只是輔助的工作,本質屬于浪費電。此外,我們的a.out本身占用的接近100%的CPU,也主要耗費在a.out自身的動作上嗎?這個時候我們也有興趣看一下,我們“perf top -p ”一下,我們發現a.out也有大量的時間落在了內核的各種函數里面:



所以從性能分析的角度來說,我們也要把這些紅框部分挖掘出來進行分析優化,因為本質他們也是純耗電,屬于overhead而不是real work。


90分到100分特別難

在所有的性能優化領域,我們都不得不正視一點,無論你多么地不愿意:就是前期的優化是相對比較容易的,越到后來越難。一個考10分的學渣,也許經過努力比較容易考到60分,再繼續挑燈夜戰,可能也能考到90,但是哪怕本著“只要學不死,就往死里學”的極限熱情,他也不一定能從90分考到100分,當然它可能考到91分。



努力到一定程度后,有沒有可能越努力成績越差呢?我覺得是可能的,因為Universal Scalability law(USL),學麻了容易走火入魔,反而出現性能的collapse。


成年人最重要的心理素質是學會和自己的平凡和解,打牌輸了不要賴著不走再打一局不如隔天換個場子打。性能優化也是一樣的,在某個角度已經搞到了91分,這個時候繼續鉆牛角尖的代價可能就比較大了。也許我們可以換另外一個角度,來做個從30分到91分的過程,最終實現總成績91+91=182分,而不是100+30=130分。


在總成績182的情況下,再去追求總成績200,心態和效率都高很多。


off-cpu和on-cpu分析同樣重要

當我們分析代碼在CPU的耗時花費在哪里的時候,我們關心系統的on-cpu profiling,但是,當我們關注延遲等問題的時候,我們不僅要關注on-cpu profiling,更多的時候,我們需要關注off-cpu profiling。off-cpu profiling的目的在于全面地評估進程不在CPU上面跑的時候,因為什么原因被調度出去。off-cpu profiling完整地打印出進程離開CPU的原因的調用棧和時間分布,比如off-cpu發生在等鎖(如mutex和rwsem)、等I/O完成、被調度搶占等情況。


性能profiling應同時著眼于on-cpu和off-cpu這兩種情況。這個和優化我們的工作效率是一樣的,我們既要上班時候盡可能降低CPU消耗,on-cpu的時候少做純耗電的無用功;也要看看是什么原因引起我們上班的時候釣魚劃水,把引起我們off-cpu的原因分析出來從而減少摸魚。



二、on-cpu分析



on-cpu分析主要著眼于2個點:一是找到占用CPU大的熱點代碼;二是提高單位運行時間內,CPU執行有效指令的條數。前一個點重心在于降低CPU利用率,后一個點則著重于提高CPU的工作效率。下面層層展開,展開過程中會直接介紹相關的工具。


on-cpu火焰圖

我們看到前述代碼中,kswapd0占據了57.7%的CPU。所以我們現在特別感興趣,它的CPU的具體走向,火焰圖可進行一個比較完整的呈現。假設kswapd0的PID是54,下面我們抓取內核線程54的信息:



我們把采樣到的數據,通過火焰圖工具進行繪制:



我們得到如下火焰圖:



火焰圖上我們發現,kswapd的時間有小部分發生在swap_writepage向zRAM寫被替換的頁面,而大部分發生在判斷頁面是否被訪問的folio_reference_one(),以及頁面向zRAM寫之前unmap這個頁面后的ptep_clear_flush()這2個動作上面。

你也許會想到要去減少folio_reference_one()和ptep_clear_flush()上面的開銷,這是一個剖析和發現的過程。


CPU消耗比例分布

火焰圖固然呈現了相關函數的CPU比例,但是,很多時候我們生成報告,尤其是向社區發patch,我們需要發送文字版的優化報告,這些報告可以突出CPU熱點在哪里。這個時候,我們可以用perf report的功能。



啥也不說了,盯著perf report里面排名第1,第2的整起來。相關的這種數據報告在Linux社區非常常見,比如MGLRU的patch 【2】?里面就列出了MGLRU中某一特性優化前后的CPU消耗對比數據:



我們看到屬于overhead的page_vma_mapped_walk()的減小,但是屬于lzo1x_1_do_compress()的real work的增大。所以,我們看數據說話,沒有數據支撐的性能優化,是很難形成任何說服力的。這也就是為什么我們在內核社區發性能優化的patch,必然會被要求大量benchmark數據支撐。


最后一公里

前面我們發現try_to_unmap()后調用的ptep_clear_flush()是熱點函數,但是它熱在哪里,具體熱在哪一行代碼呢?這個時候,我們需要進一步“perf annotate ptep_clear_flush”。



從annotate的結果可以看出,至少,在筆者運行的qemu平臺上,tlbi附近的開銷是非常大的,其他的代碼開銷幾乎可以忽略不計。當然,真實的ARM64硬件上,tlbi也絕對不便宜。


中斷屏蔽的問題

在一個類似如下spin_lock_irqsave()、spin_unlock_irqrestore()的區間里,由于采樣的中斷都是被屏蔽的,所以中間perf的采樣結果,都會在spin_unlock_irqrestore()開啟中斷的這一刻爆出來,導致ARM64平臺下,采樣的熱點落在類似spin_unlock_irqrestore()這樣的地方。這是不準確的。



我們在調試時,可以使能ARM64_PSEUDO_NMI選項,并傳遞irqchip.gicv3_pseudo_nmi=1這樣的bootargs參數。這樣,內核會用GIC的高優先級中斷模擬NMI,在local_irq_disable()、spin_lock_irqsave()、spin_lock_irq()這樣的API里面只是屏蔽低優先級中斷。



舉一個典型的栗子,ARM64 IOMMU(SMMU)的map/unmap開銷大,導致dma_map_single/sg, dma_unmap_single/sg這些APIs在開啟IOMMU的情況下,吞吐率不高。這個時候,我們通過前面的火焰圖、CPU利用率分布報告很可能已經抓到了熱點在drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c【3】的arm_smmu_cmdq_issue_cmdlist()這個函數,但是這個函數長成這個樣子,進去的時候就關中斷,出來的時候才開中斷:



這個時候,你不開啟irqchip.gicv3_pseudo_nmi=1是不可能perf annonate出來這個函數哪句話是熱點的,所有熱點都會落在末尾的local_irq_restore()這句話。但是開啟后,你才會抓到真正的熱點:



CPU執行效率topdown分析

CPU利用率相等的情況下,執行效率是不是一樣的呢?比如都是一秒里面干0.5秒的活,CPU利用率50%,干出來的活是一樣多嗎?不是的,現代計算機系統普遍采用多發射、流水線、分支預測、預取、亂序投機執行等各種復雜機制,這使得同樣時間段內能實際執行的有效指令條數,會是可變的。有兩個非常重要的概念值得所有人關注:

  • CPI:(Cycles Per Instruction)每個指令要多少周期。


  • IPC:(Instructions Per Cycle)每個周期執行多少指令。


CPI和IPC為反比例關系。在同樣CPU利用率的情況下,我們追求盡可能高的IPC。比如1個代碼跑起來IPC是2.0,另外一個1.0,那么意味著同樣的時間段,前者執行的指令是后者的2倍,CPU執行指令更順暢,stalled(被添堵、處理器空轉)的環節更少。


比如我在我的PC上面運行ls,可以看到IPC是0.9:



比如運行gcc main.c,可以看到IPC是1.36:



Ahmand Yasin在它的IEEE論文《A top-down method for performance analysis and counter architercture》中,革命性地給出了一個從CPU指令執行的順暢程度來評估和發現瓶頸的方法,允許我們從黑盒的角度以諸葛孔明“隆中對”式的格局來看問題。



現在處理器,一般在4個方面占用流水線的時間,而top-down方法,可以黑盒地呈現軟件在CPU上面運轉的時候,CPU的流水線究竟在干什么。


  • Front End Bound(前端依賴): 處理器的前端主要完成指令的譯碼,把獲取的指令翻譯為一系列的micro-ops(μops)。當CPU stalled在Front End,通常意味著CPU在取指慢(比如icache miss、解釋執行等),或者復雜指令的翻譯過程由于μops cache不命中等原因而變地漫長。Front End stalled多,意味著前端無法及時給后端“喂飽”μops。目前主流的x86處理器,每個cycle可以給Back End喂4個指令,如果Back End也及時執行的話,IPC最高可達4.0。


  • Back End Bound(后端依賴):處理器的后端主要完成前端“喂”過來的μops的執行,執行的過程可能涉及讀寫操作數(load/store)、對操作數進行加減乘除各種運算之類。Back End Bound又可再細分為2類,core bound意味著軟件更多依賴于微指令的處理能力;memory bound意味著軟件更加依賴CPU L1~L3緩存和DRAM內存性能。當CPU stalled在Back End,通常意味著復雜運算指令延遲大,或操作數從memory(包括cache和DDR)獲取的延遲大,導致部分pipeline slots為空(stall)。


  • Retiring:μops被執行完成,最終的retire動作,提交結果到寄存器或者內存。

  • Bad Speculation:處理器雖然在干活,但是投機執行的指令可能沒有用。比如分支本身應該進“else”的,預測的結果卻進了“if”執行錯誤的分支,雖然沒有stall,但是這些錯誤分支里面的指令實際白白執行了不會retire,所以也浪費了pineline的時間。這里有一個基本常識,比如“if(a) do x; else do y;”,處理器并不是等待a的判決結果后,再去做x或者y,而是先根據歷史情況投機執行x或者y,當然這個投機有可能出錯。


注意Front End Bound、Back End Bound和我們平時說的軟件是CPU bound還是I/O Bound是相似概念,比如CPU bound的軟件更加依賴計算能力并對CPU性能敏感(比如編譯Linux內核、編譯Android),I/O bound的軟件更加依賴于I/O動作本身并對I/O性能敏感(比如你把硬盤dd if=/dev/sda1 of=xxx到xxx地方去)。

我們把CPU pipeline上的任何一個硬件資源想象成一個pipeline slots,假設CPU可以同時處理4條μops,下圖共有40個slots,如果所有slots都做有用功,μops都能retiring,則IPC為4.0:




假設其中的20個slots要么是empty沒活干(stalled),或者做的是無用功(分支預測錯誤等情況),那么它的IPC可能就是2.0了。



Intel處理器架構下,已經將top-down完全地工具化,有專門的top-down工具,有的甚至已經圖形化了,比如VTune Profiler里面就有類似功能【4】,可以具體化到每一個特定函數的Front-end Bound、Back-End Bound、Bad Speculation、Retiring等的情況:



大家從上表可以看出,基本retiring的比例越低,證明pipeline slots的stall越大,CPI也就越高(IPC越低)。比如,refresh_potential()的CPI高達3.589,主要是它的Back-End Bound嚴重,其中Memory Bound高達73.2%,所以優化這個函數,要多從cache命中率(L1,L2,L3)、DDR帶寬/延遲角度考慮。而優化sort_basket()函數則要多從分支預測優化角度考慮,因為它的Bad Speculation高達50.4%。


有的童鞋對Bad Speculation可能還是不太明白,下面我們通過一個代碼栗子:



這個里面有個隨機數r = rand(),會極大地破壞分支預測的準確性,所以topdown的結果如下:



如果我們把里面的rand()函數變成自己的版本,讓分支結果并不那么隨機:



再次topdown,結果則是(retiring很大,綠色友好程序):



此時的IPC也很大,達到3.49,比較接近4.0了:



Intel方面,腳本化的工具則有pmu-tools【5】。比如筆者在自己的X86 PC(內存24GB)上面開啟zRAM后運行如下代碼:



假設kswapd的PID是202,我們捕獲以下kswapd的bound情況:



由此我們可以看出,在上述場景下,kswapd跑起來主要是一個Back End Bound,其中Back End Bound里面的memory和core bound各占25.1%和19.3%,至于memory bound的部分,它又可以細分到L1,L2,L3 cache更深層次的原因。


我們現在覺得memory bound是上述場景下kswapd的大頭,我們實際也可以采樣下kswapd的cache-misses。簡單運行“sudo perf top -e cache-misses -p 202”命令看一下,cache misses率最高的是LZ4_compress_fast_extState()、memset_erms()和isolate_lru_pages()。你也許可以怎么去優化這些函數,從而減小它們的Back-End bound的部分,提高kswapd的IPC。



Intel的平臺享受上面的工具化優勢。其他平臺的童鞋也不必懊惱,perf本身也具有topdown能力,perf stat后面有個參數是--topdown:



查看Intel童鞋的這個patch【6】,最新版本的perf實際也可以支持td-level=2這樣更細粒度的topdown打?。?/span>



整個on-cpu分析的過程是top-down的,過程中的某些步驟也是topdown的,我們用一個流程圖來描述:




三、off-cpu分析



off-cpu分析更多關注延遲問題,所以我們首先要獲知延遲的分布,這個時候我們最好使用直方圖。之后,我們可以過度到用off-cpu火焰圖等進一步分析off-cpu在等什么,而在lock contention的場合,則可以使用perf lock來進一步進行鎖的分析。


直方圖

直方圖深入人心,哪怕什么工具都沒有,純粹地用Linux內核也可以劃出直方圖。這個功能位于菜單tracer->Histogram triggers,通過內核tracepoints實現。



下面我們隨便舉個例子,看看mm/vmscan.c中shrink_inactive_list()一般回收page個數的分布。注意,這純粹是一個栗子,不對應任何的實際工程。



在直方圖中,我們關心2個點,一個是key,一個是value。比如我們以回收頁面的個數為key,回收到這一key值頁面個數的次數為value。


我們在include/trace/events/vmscan.h和mm/vmscan.c中增加這個trace:



trace_mm_vmscan_nr_reclaimed(nr_reclaimed, 1);這句話表示回收nr_reclaimed個頁面的次數增加1。


現在我們使能tracer,以nr_reclaimed為key, times為value,按照times降序排列:

?


運行系統,觸發一些內存回收動作,采樣到一些值后,直接讀取直方圖:



從直方圖可看出,實驗場景中,回收到32個pages的機會最多,占據76598次,其次是回收到1個、0個和2個的。


下面我們把所有采樣復原,改為依據nr_reclaimed升序顯示:

復原:



開啟新的采樣:

?


運行系統,觸發一些內存回收動作,采樣到一些值后,直接讀取直方圖:



有的童鞋說,我現在關注的是延遲時間的分布,不是nr_reclaimed。這完全不影響我們的原理,比如latency單位是us,我想搜集0-5ms, 5-10ms, 10-15ms, 15-20ms各個檔次的分布,我只需要trace:

trace_xxx_sys_yyy_latency(latency/5000, 1);

后面在hist中,0-5ms會是一行,5-10ms會是一行,依此類推。另外,內核里面統計延遲可用類似的代碼邏輯(來源于kernel/dma/map_benchmark.c的map_benchmark_thread函數):



eBPF/BCC中本身內嵌多個直方圖工具,可滿足許多常見的生活必須,比如之前演示的biolatency,還有這些已經自帶:

bitehist.py: Block I/O size histogram.?

argdist: Display function parameter values as a histogram or frequency count.?

bitesize: Show per process I/O size histogram.

btrfsdist: Summarize btrfs operation latency distribution as a histogram.?

cpudist: Summarize on- and off-CPU time per task as a histogram.?

dbstat: Summarize MySQL/PostgreSQL query latency as a histogram.

ext4dist: Summarize ext4 operation latency distribution as a histogram.

funcinterval: Time interval between the same function as a histogram.?

runqlat: Run queue (scheduler) latency as a histogram.

runqlen: Run queue length as a histogram.

xfsdist: Summarize XFS operation latency distribution as a histogram.

zfsdist: Summarize ZFS operation latency distribution as a histogram.

funclatency這個筆者也經常用,比如看一下vfs_read()這個函數的執行時間分布,只需要把函數名加在funclatency之后就好:



我們看到vfs_read()在實驗場景,一般延遲是8-16us之間占據第一名。但是偶爾也能大到驚人的4294967296ns,也就是4.2秒,從直方圖最后一行可以看出,這些可能就是outlier了。


eBPF/BCC可以依附于kprobe、tracepoints上,在eBPF/BCC上定制直方圖,只用寫非常簡單的腳本即可,因為直方圖是其本身內嵌的功能。比如在patch【7】中,筆者想知道kernel/sched/fair.c的select_idle_cpu()在進程被喚醒的時候,統計選中與target同cluster idle CPU,不同cluster idle CPU和沒找到idle cpu的比例,只需要寫一個簡單的腳本:



這個腳本的關鍵是涂了紅色的三行,定義了一個直方圖對象dist,然后就在里面通過dist.increment(e)增加采樣點,最后通過b["dist"].print_linear_hist("idle")把直方圖畫出來:



eBPF/BCC里面有許多直方圖的例子,我們定制自己的直方圖的時候,依葫蘆畫瓢就好。


off-cpu火焰圖

實際上,eBPF/BCC的代碼倉庫已經寫好了off-cpu工具,可以直接拿來用:

https://github.com/iovisor/bcc/blob/master/tools/offcputime.py

它的原理是抓捕內核進行進程上下文切換的時間和backtrace,比如可以對finish_task_switch()內核函數施加探針。因為我們在這個點可以知道什么進程被切換走了,什么進程被切換回來的,結合這些點的backtrace搜集,我們就可以得到睡眠和喚醒的調用棧,以及時間差??梢栽谶@個函數加tracepoint,但是沒有tracepoint的情況下,我們也可以直接attach kprobe探針。


finish_task_switch()的函數原型是:



可見參數prev是被切換走的進程,而我們通過current可以拿到當前的進程,也即我們切入的進程。通過下面的算法,即可求出整個off-cpu區間的時間和backtrace:



通過在內核finish_task_switch()的kprobe點上插入eBPF/BCC代碼來完成這個算法,這樣不需要修改和重新編譯內核。之后,我們可以把eBPF/BCC捕獲的數據,借助flamegraph工具,繪制出off-cpu火焰圖。


下面給一個非常簡單的案例,在我的Ubuntu x86 PC上面運行以下代碼,創建32個進程,每個進程申請1G內存,然后循環執行:16字節對齊的時候寫入一個字節,1MB對齊的時候睡眠30us。



測試內核是5.11.0-49-generic,內核未開啟搶占,但是允許PREEMPT_VOLUNTARY:

# CONFIG_PREEMPT_NONE is not set

CONFIG_PREEMPT_VOLUNTARY=y

# CONFIG_PREEMPT is not set

測試的環境開啟了zRAM的swap,但是關閉了磁盤相關的swap:



捕獲a.out 30秒的off-cpu數據,并繪制火焰圖。

?


得到如下火焰圖:



從以上火焰圖可以看出,a.out的延遲主要是3個方面原因:

  • 發生在其用戶態代碼本身調用的nanosleep()上;

  • 發生在page_fault的處理上;

  • 時間片到期后, timer中斷進來,把它切換走。

我們把這3個塊分別畫3個圓圈:



火焰圖的縱向是backtrace,橫向是每一種情況的off-cpu時間,橫向越寬代表這個調用stack上的off-cpu時間越久。


假設我們shrink_inactive_list()這個函數特別感興趣,則可點擊shrink_inactive_list()這個函數,單獨查看這個函數的off-cpu細節,我們發現,它其中一半的off-cpu是因為它自己調用了一個msleep(),還有很大一部分發上在它主動call了_cond_resched(),然后CPU被別人搶走;如果我們關注mutex_lock() 的延遲,則顯然發生在shrink_inactive_list() -> shrink_page_list() -> add_to_swap -> get_swap_pages() -> mutex_lock()這個路徑上。



如果我們把焦點移到kswapd,我們還是運行上面的a.out代碼,但是我們捕獲和分析的對象換為kswapd。捕獲kswapd的off-cpu數據30秒并繪制off-cpu火焰圖。

?


繪制出來的kswapd的off-cpu火焰圖如下:



可見多數延遲發生在kswapd各種路徑下(比如shrink_inactive_list -> shrink_page_list路徑)主動調用_cond_resched()出讓CPU,還有一部分延遲發生在最右邊的shrink_slab的i915顯卡驅動的slab shrink,點擊放大它:



從上圖可以看出,我們在內存回收shrink_slab()的時候,被i915驅動的i915_gem_shrink()堵住了,而i915_gem_shrink()被一個mutex_lock_interruptible()堵住了,所以i915驅動持有的一個mutex實際上給shrink_slab()是添堵了。


特別有意思的是,這個off-cpu火焰圖,還可以變成雙層的off-wake火焰圖。比如A進程等一個鎖睡眠了,B進程是持有鎖的人,B喚醒了A,在off-wake火焰圖上,它會以雙層調用棧的形式進行展示。比如在a.out引起匿名頁頻繁swap的情況下,抓一下kswapd的off-wake火焰圖:


得到的圖如下:


從圖上可以完整看出,kswapd off-cpu的原因和喚醒者。比如畫紅圈的區域,kswapd因為調用kswapd_try_to_sleep()而主動進入睡眠,a.out在swap in的過程中do_swap_page()因而需要alloc_pages()的時候因為申請內存的壓力,喚醒了kswapd內核線程。天藍色的是kswapd,淡藍色的是喚醒者。喚醒者的調用棧是從上到下,off-cpu的kswapd的調用棧是從下到上,中間通過灰色隔離帶隔開。這種描述方式,確實看起來比較驚艷有木有?



Lock Contention分析

在使能內核CONFIG_LOCKDEP 和CONFIG_LOCK_STAT 選項的情況下,我們可以通過perf lock來進行lock的contention分析。其實perf lock主要是利用了內核一系列的鎖的tracepoints,比如trace_lock_acquired(lock, ip)、trace_lock_acquired(lock, ip)、trace_lock_release(lock, ip)等。


在我運行一個匿名頁頻繁swap out/in的系統里,抓取lock情況:



然后生成報告:



看起來&rq->__lock、ptlock_ptr(page)、&lruvec->lru_lock的競爭比較激烈。尤其是&lruvec->lru_lock,由于contention比較多,total wait時間比較大。這里要特別留意一點,lock contention不一定是off-cpu的,可能也有on-cpu的,對于mutex, rwsem更多是off-cpu的;spinlock,則更多是on-cpu的。


對于off-cpu以及相關的延遲問題,我們需要通過直方圖獲知延遲分布、off-cpu/off-wakeup火焰圖獲知off-cpu的原因和喚醒者,如果是鎖競爭的情況,則進一步通過內核perf lock剖析鎖競爭。





四、總結



性能優化經常是一個全棧的工作,對工程師的要求也比較高。它是一個很難用一篇文章完整描述清楚的話題,所以本文更多只是起一個提綱挈領的作用,許多話題有待以后有機會進一步展開。文中疏漏,在所難免,還請讀者朋友海涵。最后推薦給親愛的讀者朋友們2本書:

  • BrenDan Gregg的《System Performance Enterprise and the Cloud(Second Edition)》;

  • Denis Bakhvalor的《Performance Analysis and Tuning on Modern CPUs》


    參考文獻

    【1】https://people.csail.mit.edu/nickolai/papers/boyd-wickizer-locks.pdf

    【2】https://lore.kernel.org/linux-mm/20220614071650.206064-8-yuzhao@google.com/

    【3】https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

    【4】https://www.intel.com/content/www/us/en/develop/documentation/vtune-cookbook/top/methodologies/top-down-microarchitecture-analysis-method.html#top-down-microarchitecture-analysis-method_GUID-FA8F07A1-3590-4A91-864D-CE96456F84D7

    【5】https://github.com/andikleen/pmu-tools

    【6】https://lore.kernel.org/all/1612296553-21962-9-git-send-email-kan.liang@linux.intel.com/

    【7】https://www.spinics.net/lists/arm-kernel/msg882962.html





長按關注
內核工匠微信

Linux 內核黑科技 | 技術文章 | 精選教程
Linux閱碼場 專業的Linux技術社區和Linux操作系統學習平臺,內容涉及Linux內核,Linux內存管理,Linux進程管理,Linux文件系統和IO,Linux性能調優,Linux設備驅動以及Linux虛擬化和云計算等各方各面.
評論
  • 在前六期中,我們已經分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務、風險評估與技術文檔證據鏈、第三方組件與 SBOM 供應鏈治理,以及產品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業已經能夠回答幾個核心問題:產品是否落入 CRA 適用范圍,產品由哪些組件構成,企業如何證明自己在設計、開發和上市前采取了必要的安全措施,以及產品上市后如何持續維護和安全下線。但對于真正準備落地 CRA 合規的企業來說,還有一個更現實的問題:CRA 的法規條文相對原則化,企業應當如何把“網絡安
    虹科云科技 2026-08-03 16:51 196192瀏覽
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128660瀏覽
  • 文:杜杰編輯:侯煜當地時間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 345瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 147159瀏覽
  • 在EMC測試過程中,傳導發射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 518瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌?;赝^去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 128906瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 177瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 412瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環路、TL431 精密恒壓反饋環路、PNP 功率管主功率輸出回路;實現完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節點電位;該節點直
    southcreek 2026-08-07 13:45 357瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 306瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 站着再来一次48集全免费剧情介绍视频| 高清《借钱》韩剧| 房奴试爱激情戏做爱| 侏儒人被黑人蹂躏mp4| 动感小站动感之星第134集妖精大结局| 警察锅哥第一季免费全集| 美脚迷路| 修理工的艳遇免费观看| 渔夫淫乱史| 逆转女王剧情| 房奴试爱第一季电视剧开头原声| 干柴烈火2免费观看电视剧| 安吉拉主演的《透视》电影| 李采潭在线全部电影| 米加小镇日常vlog| 爱我几何电影完整无删减免费观看| 难哄电视剧观看全集在线播放| 大笑江湖土豆网| 售楼女的秘密在线观看| 关于雇佣军的电影| 斗罗大陆免费全集免费| 著名书法家田英章去世| 五号特工组第3部| 徐若萱三级| 《法国空乘2015法版》| 随心所欲电影免费观看| 爱我几何电影在线免费观看无删减 | 特殊的美容院5 韩国| 《误杀》电影完整版| 超能查派西瓜影音| 《村妓HD高清| 李恩美电影在线观看| 21世纪性格爱情指南加拿大| 折腰电视剧在线观看全集| 你好 我的大夫| 乐普制氧机| 姊妹牙医 在线看完整版免费| 爸爸在这儿| 妈妈的乖孩子免费播放电影| 夺命狂花电影在线观看完整版 | 小碗干炸| 离婚大战| 部长来家做客无删减版中文 | 种其因者须食其果短剧大结局| 真人版对魔忍阿莎姬| 天纵奇材| 我的青春遇见你免费全集观看| 美国式保罗1原版| 侏罗纪世界3国语版免费观看| 高清盐沼之下未删减| 塔日酒店电影在线观看| 女神蒙上眼| 漂亮小小瘦子3| 左旋肉碱有用么| 酒店激战第5季更新时间| 谷围南亭一季免费观看| 一不小心捡到爱免费| 《倔强驱魔师》1-4集在线观看免费视 | 赤焰战场2| 卿卿日常在线观看| 高清《食物链》第二集| 对不起我不爱你了短剧免费观看| 男女一起愁愁愁免费全集电视剧免费| 饥饿站台2在线观看| 向爸爸播种电影的英文| 天行者高清| 罪恶王冠02| 隔壁漂亮女邻居躲避我是什么心理 | 法国兄妹开荒原版视频播放| 周杰伦演唱会 沈阳| 舞出我人生2高清下载| 同学3| 花丝网花制作| 缉毒警察绝不会输动漫免费观看| xl司令动漫第一季全集在线观看免费播放| 法国禁忌7中文版| 最新恐怖电影2025在线观看| 韩国电影朋友家的麦子| 皇后的品格免费观看完整版 | 上海风云1| 国家宝藏之觐天宝匣第二部| 满天星壮志凌云2011版| 东京女孩时尚秀| 一拳超人ova| 我和老公的部下| 家和万事兴之双喜临门| 十天的爱人| 按摩美女胸部电影| 叶子楣《极乐宝鉴》电影免费观看| 沧元图60集在线观看| 桃色凶气| 人生电影高清在线观看| 情债电视剧| 少妇的诱惑电影观看| 我爱上朋友的姐姐韩剧| 羊炭疽病| 凤舞九天dj现场| 三个和尚| 地球最末日| 黛恩的爱情故事在线观看| 黑大粗大战俄罗斯美女| 金钱之味快播| 女版壮志凌云歌曲| 简言的夏冬在线观看| 水手服饲养未减版主演是谁| 广州火车站售票时间| 国光帮帮忙沈玉琳| 哈利波特与密室电影原版| xnxnx18美女| 男女一起相嗟嗟免费观看在学校| 陷阱韩国版在线看| 美丽的的小樱桃| 康家电视| 《品味人生》伊丽莎白.坎贝奇| 使徒行者优酷| 姐妹牙医在线电影播放| 兰陵王电视剧全集下载| 探险旅行| 俄罗斯卖车子销售和老板电影 | 黑人巨大两根一起挤进的视频| 电影《和部长一起去出差旅》中文 | 公之孚| 活在当下 电影| 成化十四年电视剧免费观看完整版| jizzcom日本| 电视剧记忆之城| 桃花在线观看免费高清电视剧98| 养母的花样年华| 好迪代言人李玟| 最坏的奥特战士| 太一剑仙传| 俄罗斯女人高潮的时候喊什么| 白鸟ゆな| 八角笼中王宝强在线观看免费| 东北虎遇见南方小土豆秒变咪咪| 千面女郎| 隋唐英雄传4部| 莫莉3特别的酒店免费| 吻到心伤透| 入室强奸初中生免费观看 | 星辰变第二季免费完整版| 《美容院:特殊待遇在线观看 | 电影偷窥者| 霍比特人2完整版| 爱情公寓3 19| 神雕侠侣电影| 美容院特别待遇| 巨人的进击| 苦尽来遇见你韩剧免费观看全集| 插曲的痛40集全集免费播放电影| 《暮光之城4:破晓(下)》| 铁血尖刀全集| 369免费电影。你懂得| 山河令电视剧在线观看| 宁安如梦剧免费观看策驰| 《倔强驱魔师》免费观看| 弃女归家:家产归我完整版观看| 偷香高手| 荷尔蒙6美国版| 女儿的朋友1免费观看全集电视剧| 《花嫁高柳家》动漫日漫全集| 燃冬电影高清在线观看免费| 耙怎么读| 世界上第一个僵尸| 高压监狱第二部在线观看完整免费高清原声满天星 | 儿子与情人免费播放| 电视连续剧爱| 布鲁克读大学满天星版| 人生赢家| 非洲和尚| 独山县| 机动战士高达seed粤语| 无名天使电视剧国语版免费观看| 致我们终将逝去的青春| 插曲的痛120集在线观看免费下载| 解说小智| 漂亮的保姆1完整版免费| H版欧美成人版白雪公主 | 韩国办公室秘书| 伽玛刀治疗肝癌| 林正英100部鬼片免费| 黑暗大陆| 叛逆者1-42集完整| 终结者qvod| 樊振东看霉霉演唱会| 最美和声 第一季| 凯瑟琳1991版满天星《一千零一夜》| 老公原谅我在线| 突围靳东43集全集免费观看策驰| 需要爸爸的播放美国电影在线观看| 永不磨灭的番号搜狐| 晚娘2012下| 超级教师第三季完整版| 致埃文汉森| 百合女女互慰吃奶互揉网站| 《私人助理2》韩剧| 《性》电影播放| 高三女孩热血发言燃爆全场 | 福尔摩斯小姐2| 初体验5在线观看电视剧全集免费 《替父还债十日》电影在线观看 牙医姐妹电影在线观看 | 果宝特攻3动画片全集| HD版泰山《激战丛林》中文完| 中国刑警电视剧| 卖房的女销售在线观看| 情深深雨蒙蒙35| 三年大片观看完整版免费高清| 勇敢者的游戏1| 影子爱人电影| 3对1:2人一次性体检4| 平成假面骑士| 妻子的背叛第3集| 漂亮的女朋友电视剧大结局 | 风火战纪| 新有菜未删版| 美国忌讳1–5| 电视剧迎风的青春免费观看| 飞轮海mv花絮| 玛沁县| 《斗罗大陆》免费观看全集在线观看 | 不良义姐在线观看| 屋塔房王世子剧情介绍| 星汉灿烂免费观看全集| 老同学36普通话 | 法国空乘2中字| 《裸乳按摩》福利片| 河南四平调小包公| 百妖谱5什么时候出| 男女一起愁愁愁在线观看全集高清开| 夫妻那些事免费播放完整版电视剧| 我们一起来看流星雨| 大连市| 绝世战魂在线观看全集免费| 孤注一掷张艺兴在线播放免费| 光环夜幕| 小密桃5| ayy4电影| 亮剑电视剧免费观看全集| 棒棒tv| 中国结婚率创新低| 咱们结婚吧在线观看| 被躁BD水电工在浴室| 大漠孤侠| 看得见的女孩动漫全集观看| 浴火奔腾浴红| 视频电影在线观看免费观看完整版| 上错花轿嫁对郎在线观看| 郭静纯纯色| 蛇妖1988空姐| 《原始人》电影免费观看| 美国式禁忌在线播放| 《私人航空》在线观看| 午夜福利在线观看6080| 女状元短剧全集| 别墅换妻| 华丽上班族 电影| 非诚勿扰 2号| 我的游泳女教练3季中文版 | 万州区| 夸家乡的日记| 斗罗大陆免费观看在线| 她说爱情已迟暮 小说| 斯巴达女版三部曲免费观看| 极恶老大第二季全集在线观看 | 凯登克罗斯《急诊护士》| 从结婚开始恋爱电视剧全集| 火影忍者剧场版 忍者之路| 天桥风云第十一季| 侄女开发日记1-6季| 逆天修仙飒爆:废柴嫡女短剧全集| 奇幻贵公子第二季| 安斋拉拉在线观看视频| 天剑绝刀之独孤九剑| 百媚千娇全集| 本乡爱| 我要再来一次| 巴基斯坦老电影| 阴阳镇怪谈在线观看免费完整版 | 韩剧 秘密花园| 宝贝我跟你老公比谁的更大| 小小少女05| 《蜜桃成熟时2》| 天真有牙| 咖宝车神之拯救联盟| 电影《北越暴行》女民兵免费观看| 囚欢七夜:冷心总裁虐恋妻| 金金丁字广场舞私人订制| 日本《乳房按摩》在线| 洛杉矶之战在线观看完整版| 不可思议的录像带| 年轻母亲6中文字版免费| 水管维修工韩国免费在线| 釜山行2在线观看免费观看完整版| 今天我相亲| 1—5普通话版免费观看| 侠之大者完整版免费观看| 家有艳妻| 82版杨敏思版本1-5电视剧免费观看| 颤抖吧阿部一季电视剧免费观看 | 暴躁少女86全集高清观看| 朋友的妻子中字 在线观看交换| 高清《韩国财阀2》电影| 花与蛇4之牙医诊所| 西行纪第2季| 地铁迷情| 还珠格格之燕儿翩翩飞爱奇艺| 哇嘎成人电影| 刺青下载| 三年大片免费观看完整版高清第三集 | 女友的妈妈免费观看| 远古入侵国语| 玫瑰旅馆| 特殊的游泳教练在线观看中字 | 《贤惠阿姨》动漫免费观看| 在线看古装电视剧| 星球大战女版满天星免费观看| 蛮好的人生全集| 我推的孩子动画免费观看全集| 万宁市| 战狼6欧式少女免费播放全部| 年轻的母亲韩剧电视剧全集| 豆腐西施杨七巧| 老婆6在线观看免费版电视剧| 瑞士军刀男 下载| 韩国伦理片爱人| 电影《需要爸爸播种》演员里的 | 钟馗抓妖记| 正在播放: JUL-975 没有我丈夫的五天,我被命令禁欲到第一个晚上,我的性岳父对 | 史努比动画片| 爱的释放| 我独自升级第二季在线免费观看 | 自制ipad| 黑山匪帮| 坠落的女律师日剧免费观看| 遥远的距离大结局| 五号特工组1全集| 女版《斯巴达》| 快乐星球第2部| 爱的二八定律电视剧免费观看完整版 | 宫锁珠帘全集在线观看| 微电影《莫陌2》在线观看| 韩剧花样男子国语版| 美女家政| 超雄综合症是精神病吗| 做我的奴役| 晚娘 2电影完整版| 乱肉杂交怀孕系列小说BL| 杨丽花歌仔戏薛丁山| 特殊理发店待遇8的最新章节和内容 | melody的女超人| 长津湖战役3免费观看| 小欢喜电视剧完整版| 总统夫人罗丽星克莱尔| 狼人大战| 新天师斗僵尸2| 铁蛋的一天全集| 菠萝蜜电影免费看。| 密桃诚熟时1997| 幸得相遇离婚时短剧免费观看| 印度空姐2在线观看完整版| 我主沉浮电视剧全集免费观看| 只属于我的女神| 美国美人电影| 法国空姐4免费高清原声满天星美版百度| 鬼灭之刃游郭篇在线观看| 契卡百度影音| 白峰美羽| 风俗校园祭动漫在线观看全集| 电影网站在线| 大丈夫2| 脱狱者侵犯排卵期人妻| gae枯萎之花上的眼泪| 《淮水竹亭》免费观看| 屏山县| 《美容院:特殊待遇在线观看 | 天空之城| 麦乐迪与父亲经典片段| 沈腾回应生病传闻| 工藤拉拉电影在线| 老和尚与小姑娘的人物性格| 喜爱夜蒲1粤语高清| 白峰601电影免费观看| 九月风暴全集| 九重紫电视剧在线播放视频观看高清| 美丽小的瘦子4| 美味的邂逅| xenos陌生人| 纯纯欲动HD在线动漫| 男人和女人愁愁愁电视剧在线观op| 《狙击手-斯莫希军官》| 《前任1》高清完整版| 外出的目的电影| 圣德罗佩的姑娘们高清| 周天 空竹| 洪金宝再谈周星驰| 戴安琳恩《满天星》| 林正英僵尸全集国语| 垃圾桶披萨| 沉香如屑电视剧40全集在线播放 | 职员到老板:打工人全集免费| 双子星公主 第2部| XL司令第二季真人版全集免 | 黑袍纠察队4| 印度空姐2免费高清完整版观看| 图书馆的女朋友免费动漫高清电视剧动漫第五集无广告 | 无尽的爱电视剧免费观看| 老娘身价过亿:打脸拜金女全集免费| 女版《壮志凌云》| 狼的诱惑| 向左走向右走电影| 烟台市| 女销售员的秘密2| 巴基斯坦地图中文版| 黄百韬简介及最后结局| 小瘦子3中文| 《开始捉迷藏 第二季》未删减| 我的妈妈动漫日语版动画片| 使徒行者粤语15| 白峰美羽无码电影| 维纳斯vs魔人| 周杰伦林俊杰合唱稻香| 年轻的妻子在线| 加勒比海盗成人在线观看 | 水润女人刘志贤主演电视剧| 绳责电影| 半夏电视剧免费观看全集剧情| 女版战狼9学生| 李采潭外遇的妻子| 洗屋全集在线免费观看| 彼女动漫| 粉红大白菜正宗版完整版| 美国末日之战丧尸电影免费观看| 武契奇联大痛斥北约| 《天气之子》电影免费看| 1980保罗一家免费观看| 不可撤销2| 性生交大片免费看女人按摩| 吸血鬼日记第四季字幕| 《妽妽的丰满大胸》2| 乘风破浪5免费观看| 聊斋艳谭第3集| 活着真好 电视剧| 麦乐迪家庭矛盾播放| 禁忌的女人电影| 贞洁美妇沦陷| 柬埔寨公主用中文拜年| 《卖楼的女销售》| 汽车动画| 高考一段线二段线什么意思| 《黄花闺女》完整版| 麦乐迪女超人的屈辱在线观看| 洪湖英雄传电视剧| 杏林春暖在线免费观看| 蜘蛛侠大战超人| 《教室的秘密》大结局| 妹妹的朋友完整版| 王力宏事件始末| 圣斗士星矢国语全集| 私人女性监狱电影在线观看| 窃听风云2| 浪客剑心免费观看| 如果明天的路你不知该往哪走| F杯巨乳邻居的一天| 《后宫·甄嬛传》| 大宅门全集完整版免费| 一人之下电视剧免费观看全集高清 | 导弹旅长 电视剧| 电影爱我几何完整版免费观看| 长安二十四计全集免费看| 酋长的女儿2满天星版叫什么| 动感之星妖精179集免费观看| 人心俱乐部电视剧在线观看免费 | 《爱你几何》高清全集免费播放| 你敢嫁我敢娶| 消失的妻子全集观看| 最美的时光45| 美女在线观看完整免费高清原声满天星奔跑吧 | 韩国电影售楼部的小姐| 旋风管家第四季| 动画片大头儿子小头爸爸| b哥全集| 美国禁忌睫毛膏高清版汉字| 全职高手第3季| 暗夜传说4| 白夜追凶21| 《初体验5》完整版免费观| 美女死尸| 我的朋友很少第二季| 神印王座动漫免费观看| 隋唐演义田连元| 天津一垃圾桶现弃婴| 蜜桃成熟时下载地址| 插曲45分钟免费观看电视剧第6集| 热情的邻居| 神话电影版| 电影《牙医姐妹》完整版| 芭娜娜现场| 监狱疯云| 好好过日子| 男女愁愁愁电视剧在线观看网页| 我是机器人 电视剧| 暑假作业赶工名场面| 玩弄我的三位美艳馊子在线电影| 《品味人生》观看免费| 漂亮女朋友BD中文| 《向涟苍士献上纯洁》| 青木玄德| 姐姐的朋友2在线观看| 八戒八戒8在线电影大全| 至尊无上之永霸天下| 水萝拉日语中字在线| 小心肝儿美国电影免费观看完整版 | 消失的她完整版| 荷尔蒙少女3高清完整版| 甄嬛传电视剧全集完整版| 那场雨爱上你泰剧在线观看| 八尺夫人正版免费观看| 禁止的爱:善良的小峓在钱| 大凶女前辈在线观看| 张哲瀚许凯同框| 成龙历险记第四季| 坎贝奇第三部曲无憾免费播放| 小棉袄免费观看全集电影| 战马在线观看| 特邀外卖| 纯情罗曼史第一季| 监狱学园动漫全集观看| 漂亮的妈妈7字开头| 策驰影院免费| 加菲猫家族中文版电影免费观看| 超级飞侠第十二季免费观看| 砍贝奇品味人生| 贪婪欲望岛| 古惑仔之少年激斗| 韩国电影女教师在线观看| 特殊治疗室| 全都是精品| 保罗5雪莉一家1| 女朋友高清在线观看免费韩国| 学生酒店1-580集| 浪漫女家教电视剧免费完整版| 人皮日记| 聊斋花姑子| 刀锋1937| 白嫖者联盟免费观看完整版电视剧| 电影魔女2| 单身地狱第四季免费观看| 大河儿女全集| 周弘版《村枝》免费观看电视剧| 谎言美人| 满天星八尺夫人在线观看免费播| 咱们结婚吧分集剧情介绍| 朝国的继4| 张云熙| 星球大战:摩尔-暗影之王未删减| 叶子楣《极乐宝鉴》电影在线观看| 美女武士国语| 天天想你在线观看完整版电影视频 | 流星花园 泰版观看全集| 孝义市| 叶子楣电影| 二b青年的不醉人生| 同学两亿岁免费观看免费全集| 我知道我爱你电视剧| 《代替满足妻子》电影| 浪花男神| 客户名单电影| 五星红旗迎风飘扬MV| 尼泊尔新纸币激怒印度| 台剧《浪漫女家教》中文字幕版 | 不惑之旅电视剧免费视频| 男生和女生一起愁愁免费观看全集高清完整版电视剧 | 丁度执导18禁电影| 伊甸园之东国语版| 青春四十在线观看| 妈妈爱上儿子同学完整版电影| 爱丫爱丫影院最新电视剧免费观看 | 电影《黑暗森林》莉娜安德森| 戈恩事件| 无颜美女| 小公主苏菲亚第四季免费观看| 宠物小精灵xyz| 做aj的电视剧全部免费| 柳舟记电视剧在线观看全集免费| 开心鬼撞鬼迅雷下载| 妈妈的朋友免费在线| 伊丽莎白坎贝奇的《品味人生》| 鸭王2百度云| 《曼娜艳荡性史》| 再度重相逢孙露| 唐山市| 莫妮爱我几何免费高清电影无删减 | 深圳富士康搬迁| 美乃雀主演的《青鸟》在线播放| 超级警察免费观看完整版| 《发财日记》免费观看| 五号特工组1全集| 欲望和智慧电影| 混血女精油按摩在线观看 | 春欲未删减版dvd| 爱不懂事| 法国空姐2019满天星法版:星辉照耀下的职业光芒中文版 | 黄绮珊离不开你歌词| 3对1:2人一次性体检4| 徐若瑄 天使心| 无结局的爱| 81号档案| 吕良伟粤语电影| 电影《空中乘务2》免费观看完整版 | 天龙八部82免费版| 傻婿觉醒:大佬跪迎全集免费| 玩弄丰满的女学生在线观看| 无影良贼| 周处除三害在线观看完整普通话| tobo4| 韩国 外卖员的特殊待遇| 漂流欲室下载| 十七大内容| 王在山轻音乐团| 歼灭天际线1-24全集| 免费的小猪佩奇全集观看| 红苹果短剧免费观看| 女海盗在线观看| 野花免费观看高清视频| 悲情城市电影原声在线观看免费高清| 人马配速60分钟视频教程大全| 名侦探柯南免费观看全集完整版| 电影《官人我要》免费观看| 女员工的付出中文版| 沉睡谷第二季| 朋友的妈妈动漫| 如虎添翼下一句怎么接| 初体验5免费观看全部电视剧| 总统之夜1997法国版第一季 | 中国女篮PK法国| 一起愁愁30集全集免费看| 我的宝贝电视剧| 铁血尖刀| 我和我的家乡免费观看高清 | 想要的一天| 日本电影部长来做客中字| 傲魂之活死人 电视剧| 老版水浒传武松打虎| 一次邂逅| 黑girl成员| 老板的女儿满天星版叫什么名字 | 歌唱二小放牛郎电影| 水月洞天第三部幽冥传奇| 法国电影《女超人》在线观看| 坎贝奇无憾1080P免费看| 行尸走肉第三季09| 爱有来生在线| 宫本武藏的徒弟| 免费观看90分钟高清电视| 杉原杏璃拍av吗| 《蓝帽子》电影免费观看| 巡视检查组| 人间中毒在线观看完整版爱| 50岁阿姨大人电视剧免费观看| 斗罗大陆三龙王传说第三季| 两天一夜韩国版2014| 嫦娥奔月电视剧| 命运航班第一季| 《花子vs倔强驱魔师》动漫第4集在线 | 哭悲在线观看| 杨敏思金瓶悔1一5集演员表| 21世纪前女指南无删减免费看| 真还传还了8.24亿| 奇葩说第六季| 二次元胸像气球越来越大的视频| 女人复仇记电视剧| 《和部长一起去出差旅| 为了奥运会巴黎地铁椅子终于洗了| 奔跑吧兄弟| 爱是欢乐的源泉| 宝儿only one| 凌云志志(法国)满天星在线| 1一68集电视剧心如铁免费播放| 待到重逢时泰剧| 《下女》| 参谋不带长| 大胸年轻继拇5免费| 小胖的异想天开| 深情眼全集免费完整版| 第八个嫌疑人演员表| 过气明星逆袭全集免费| 麦乐迪家庭矛盾4| 给我在线观看| 都铎王朝第一季qvod| 小燕子一家人| 雍正王朝电视剧全集56| 泰国屠宰娃娃观看| 中国人已着手在月球生产水了| 好儿子妈好爽快插我嫩草视频| 人间中毒在观完整有限中字| 集中营电影| 后宫露营第一季未增减 0.0| 沉睡花园一共多少集| 时间裂缝在线观看| 名侦探柯南国语| 女老板电影| 麦乐迪女超人在线无删减电影免费观看 | 欢迎来到实力至上主义教室 第四季| 爸爸播种电影免费观看高清版| 死神来了6完整版高清免费看| 策驰影院电视剧免费策驰电影| 再见龙生你好人生| 儿子与情人视频完整版在线观看| 品色AV| 青岛DJ小可| rhts 040| 蒋玲玲版渔夫的荒野史记蒋玲玲的一| 爱的色放mp4下载| 亦舞之城电视剧免费观看高清| 战狼6高清国语免费观看影视大全下载什么借钱平台好的 | 隔壁女孩5中汉字| 女保险公司推销员8中字的特点| 风之舞 电视剧| 女朋友的男朋友| 社会图片| 人猿泰山Hrd| 女娲传说之灵珠电视剧| 电影《法国女仆》免费观看| 《借妻》完整版观看| 《红高粱》| 姐妹牙医电影在线看| 公之浮手中字15| 银魂180| 日喀则怎么读| 人生若如初见全集资源| 少女6少女大人演员表高清版| 高压监狱3法国完整版免费| 战火中青春电视剧| 《亲爱的客栈2026》| 别再犹豫国语版全集41| 文成县| 做aj的电视剧大全免费观看| 礼仪老师韩国电影完整版| 战斗王之飓风战魂2| 仁心解码电视剧| 春节联欢晚会2024| 美容室的待遇5HD中文| 邵氏电影《聊斋奇谭》| 暗潮危机电影完整版在线观看| 斗罗大陆240集免费观看全集在线| 勇者大冲关| 电视剧追鱼传奇全集| 金粉世家电视剧免费观看| 美容院:特殊待遇3| 黑心鬼国语| 动动广场舞甩葱歌| 代替不孕的丈夫HD中文字幕| 十八岁的天空第二部| 恰同学少年全集| 再次见到你电视剧免费观看| 隐龙老爸风华绝代短剧免费观看| 青涩体现意大利| 法国空姐四级片| 《楼上楼下》| 如来神掌国语| 民初奇人传全集免费观看| 连州市| 渔夫荒| 蓝精灵动画片| 爱唯侦察在线观着| 丰满姨母2电影| 善良的姐姐线观高清3| 未来日记迅雷下载| 《维修师傅的艳遇HD》中文| 朴亚珍电影HD| 爱在太空| 《痴心劫》理伦片在线观看| 电影《搜索》| 凯莉布鲁克满天星三部曲是哪| 高清《灭火宝贝2》美国版免费观看| 斗罗大陆114| 两个母亲电影ID| 周深成跨年最忙的人| 《变形金刚》| 地心历险记2 720P| 《美容院1:特殊待遇》在线观看| 迅雷机战| 风中奇缘全集| 郭峰歌曲| 北欧精灵《麦乐迪女超人》在线| 《水电维修工的艳遇》在线观看| 三妹免费| 我的邻居长不大免费阅读| 山炮进城| 早川濑里奈47部作品在线播放| 激战丛林在线观看完整版下载| 法国空姐2008满天星法版:星辉照耀下 | 小仙之瑶动漫免费观看完整版| 制服诱惑2 地下法庭| 欲望校园车永莉完整电影在线看视频| 杨春霞乱云飞| 小小周正面曝光| 七夜雪 电视剧| 歌声飘过30年百首金曲演唱会下载 | 奥本海默在线原版免费| 枭起青壤在线免费观看| 昆仑神宫电视剧| 恨君不似江楼月免费观看全集| 越南电影《暴行》| 暗战电影| 我和我的继女| 韩剧我的妻子| 星汉灿烂 电视剧| 美国睫毛膏3免费播放| 夫妻按摩隔帘电影合法吗| 反贪风暴5免费观看完整版| 雾散之时短剧免费观看| 美国共和党领袖:已经炒了佩洛西| 甄子丹锦衣卫| 哇嘎电影高清免费资源| 性xX色3D动画xX无尽年轻 | 金瓶梅电视剧全集电视剧在线看免费观看| 战狼欧试少女九| 电影三毛从军记| 爱情真善美全集80| 非凡医者电视剧免费观看| 爱我就别想太多免费版| 苍空电影完整版在线观看| 黑色电话2电影| 浓从暗中来| 难以置信的爱| 《和社长一起去出差旅》电影介绍 | 欲望校园车永莉完整电影在线看视频 | 要妈妈播种的1983年电影 | 《性/生活4》未删减版| 陪讨厌部长去出差先锋影音| 情刺电视剧免费观看| 贝雷帽钩织教程视频| 美味快递员特殊待遇| 灵域电视剧在线观看完整版免费 | 暴躁老妈1-46集在线观看电视剧| 恋爱中的死神| 莫比乌斯电影完整版免费观看| 高清《年轻的女教师》电影| xl司令真人| 耍要爸爸播种子| 浪花男神| 木府风云主题曲净土| 大秦帝国第二部高清| 本乡爱主演电影大全| 六神合体| 罗丽星克莱尔《X迷宫》在线| 挣扎吧当亚君| 黑白配国语版在线播放| 事物的秘密水池一段是多少| 电影《巴黎女流氓》剧情完整版| 电锯惊魂7高清版|