在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

不同語言運(yùn)行100萬個(gè)并發(fā)任務(wù)需要多少內(nèi)存?

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:博客園 ? 2023-07-12 14:14 ? 次閱讀

來自:博客園,譯者:InCerry

正文

在這篇博客文章中,我深入探討了異步和多線程編程在內(nèi)存消耗方面的比較,跨足了如Rust、Go、Java、C#、Python、Node.js 和 Elixir等流行語言。

不久前,我不得不對(duì)幾個(gè)計(jì)算機(jī)程序進(jìn)行性能比較,這些程序旨在處理大量的網(wǎng)絡(luò)連接。我發(fā)現(xiàn)那些程序在內(nèi)存消耗方面有巨大的差異,甚至超過20倍。有些程序在10000個(gè)連接中僅消耗了略高于100MB的內(nèi)存,但另一些程序卻達(dá)到了接近3GB。

不幸的是,這些程序相當(dāng)復(fù)雜,功能也不盡相同,因此很難直接進(jìn)行比較并得出有意義的結(jié)論,因?yàn)檫@不是一個(gè)典型的蘋果到蘋果的比較。這促使我想出了創(chuàng)建一個(gè)綜合性基準(zhǔn)測(cè)試的想法。

基準(zhǔn)測(cè)試

我使用各種編程語言創(chuàng)建了以下程序:

啟動(dòng)N個(gè)并發(fā)任務(wù),每個(gè)任務(wù)等待10秒鐘,然后在所有任務(wù)完成后程序就退出。任務(wù)的數(shù)量由命令行參數(shù)控制。

在ChatGPT的小小幫助下,我可以在幾分鐘內(nèi)用各種編程語言編寫出這樣的程序,甚至包括那些我不是每天都在用的編程語言。為了方便起見,所有基準(zhǔn)測(cè)試代碼都可以在我的GitHub上找到。

Rust

我用Rust編寫了3個(gè)程序。第一個(gè)程序使用了傳統(tǒng)的線程。以下是它的核心部分:

letmuthandles=Vec::new();
for_in0..num_threads{
lethandle=thread::spawn(||{
thread::from_secs(10));
});
handles.push(handle);
}
forhandleinhandles{
handle.join().unwrap();
}

另外兩個(gè)版本使用了async,一個(gè)使用tokio,另一個(gè)使用async-std。以下是使用tokio的版本的核心部分:

letmuttasks=Vec::new();
for_in0..num_tasks{
tasks.push(task::spawn(async{
time::from_secs(10)).await;
}));
}
fortaskintasks{
task.await.unwrap();
}

async-std版本與此非常相似,因此我在這里就不再引用了。

Go

在Go語言中,goroutine是實(shí)現(xiàn)并發(fā)的基本構(gòu)建塊。我們不需要分開等待它們,而是使用WaitGroup來代替:

varwgsync.WaitGroup
fori:=0;i

Java

Java傳統(tǒng)上使用線程,但JDK 21提供了虛擬線程的預(yù)覽,這是一個(gè)類似于goroutine的概念。因此,我創(chuàng)建了兩個(gè)版本的基準(zhǔn)測(cè)試。我也很好奇Java線程與Rust線程的比較。

Listthreads=newArrayList<>();
for(inti=0;i{
try{
Thread.sleep(Duration.ofSeconds(10));
}catch(InterruptedExceptione){
}
});
thread.start();
threads.add(thread);
}
for(Threadthread:threads){
thread.join();
}

下面是使用虛擬線程的版本。注意看它是多么的相似!幾乎一模一樣!

Listthreads=newArrayList<>();
for(inti=0;i{
try{
Thread.sleep(Duration.ofSeconds(10));
}catch(InterruptedExceptione){
}
});
threads.add(thread);
}
for(Threadthread:threads){
thread.join();
}

C#

與Rust類似,C#對(duì)async/await也有一流的支持:

Listtasks=newList();
for(inti=0;i
{
awaitTask.Delay(TimeSpan.FromSeconds(10));
});
tasks.Add(task);
}
awaitTask.WhenAll(tasks);

Node.JS

下面是 Node.JS:

constdelay=util.promisify(setTimeout);
consttasks=[];

for(leti=0;i

Python

還有Python 3.5版本中加入了async/await,所以可以這樣寫:

asyncdefperform_task():
awaitasyncio.sleep(10)


tasks=[]

fortask_idinrange(num_tasks):
task=asyncio.create_task(perform_task())
tasks.append(task)

awaitasyncio.gather(*tasks)

Elixir

Elixir 也因其異步功能而聞名:

tasks=
for_<-?1..num_tasks?do
????????Task.async(fn?->
:timer.sleep(10000)
end)
end

Task.await_many(tasks,:infinity)

測(cè)試環(huán)境

硬件: Intel(R) Xeon(R) CPU E3-1505M v6 @ 3.00GHz

操作系統(tǒng): Ubuntu 22.04 LTS, Linux p5520 5.15.0-72-generic

Rust: 1.69

Go: 1.18.1

Java: OpenJDK “21-ea” build 21-ea+22-1890

.NET: 6.0.116

Node.JS: v12.22.9

Python: 3.10.6

Elixir: Erlang/OTP 24 erts-12.2.1, Elixir 1.12.2

所有程序在可用的情況下都使用發(fā)布模式(release mode)進(jìn)行運(yùn)行。其他選項(xiàng)保持為默認(rèn)設(shè)置。

結(jié)果

最小內(nèi)存占用

讓我們從一些小的任務(wù)開始。因?yàn)槟承┻\(yùn)行時(shí)需要為自己分配一些內(nèi)存,所以我們首先只啟動(dòng)一個(gè)任務(wù)。

adaae568-2062-11ee-962d-dac502259ad0.png

圖1:?jiǎn)?dòng)一個(gè)任務(wù)所需的峰值內(nèi)存

我們可以看到,這些程序確實(shí)分為兩組。Go和Rust程序,靜態(tài)編譯為本地可執(zhí)行文件,需要很少的內(nèi)存。其他在托管平臺(tái)上運(yùn)行或通過解釋器消耗更多內(nèi)存的程序,盡管在這種情況下Python表現(xiàn)得相當(dāng)好。這兩組之間的內(nèi)存消耗差距大約有一個(gè)數(shù)量級(jí)。

讓我感到驚訝的是,.NET某種程度上具有最差的內(nèi)存占用,但我猜這可以通過某些設(shè)置進(jìn)行調(diào)整。如果有任何技巧,請(qǐng)?jiān)谠u(píng)論中告訴我。在調(diào)試模式和發(fā)布模式之間,我沒有看到太大的區(qū)別。

10k 任務(wù)

add0b8c4-2062-11ee-962d-dac502259ad0.png

圖2:?jiǎn)?dòng)10,000個(gè)任務(wù)所需的峰值內(nèi)存

這里有一些意外發(fā)現(xiàn)!大家可能都預(yù)計(jì)線程將成為這個(gè)基準(zhǔn)測(cè)試的大輸家。這對(duì)于Java線程確實(shí)如此,實(shí)際上它們消耗了將近250MB的內(nèi)存。但是從Rust中使用的原生Linux線程似乎足夠輕量級(jí),在10000個(gè)線程時(shí),內(nèi)存消耗仍然低于許多其他運(yùn)行時(shí)的空閑內(nèi)存消耗。異步任務(wù)或虛擬(綠色)線程可能比原生線程更輕,但我們?cè)谥挥?0000個(gè)任務(wù)時(shí)看不到這種優(yōu)勢(shì)。我們需要更多的任務(wù)。

另一個(gè)意外之處是Go。Goroutines應(yīng)該非常輕量,但實(shí)際上,它們消耗的內(nèi)存超過了Rust線程所需的50%。坦率地說,我本以為Go的優(yōu)勢(shì)會(huì)更大。因此,我認(rèn)為在10000個(gè)并發(fā)任務(wù)中,線程仍然是相當(dāng)有競(jìng)爭(zhēng)力的替代方案。Linux內(nèi)核在這方面肯定做得很好。

Go也失去了它在上一個(gè)基準(zhǔn)測(cè)試中相對(duì)于Rust異步所占據(jù)的微小優(yōu)勢(shì),現(xiàn)在它比最好的Rust程序消耗的內(nèi)存多出6倍以上。它還被Python超越。

最后一個(gè)意外之處是,在10000個(gè)任務(wù)時(shí),.NET的內(nèi)存消耗并沒有從空閑內(nèi)存使用中顯著增加??赡芩皇鞘褂昧祟A(yù)分配的內(nèi)存?;蛘咚目臻e內(nèi)存使用如此高,10000個(gè)任務(wù)太少以至于不重要。

100k 任務(wù)

我無法在我的系統(tǒng)上啟動(dòng)100,000個(gè)線程,所以線程基準(zhǔn)測(cè)試必須被排除??赡苓@可以通過某種方式調(diào)整系統(tǒng)設(shè)置來實(shí)現(xiàn),但嘗試了一個(gè)小時(shí)后,我放棄了。所以在100,000個(gè)任務(wù)時(shí),你可能不想使用線程。

ade99c18-2062-11ee-962d-dac502259ad0.png

在這一點(diǎn)上,Go程序不僅被Rust擊敗,還被Java、C#和Node.JS擊敗。

而Linux .NET可能有作弊,因?yàn)樗膬?nèi)存使用仍然沒有增加。 我不得不仔細(xì)檢查一下是否確實(shí)啟動(dòng)了正確數(shù)量的任務(wù),果然,它確實(shí)做到了。而且它在大約10秒后仍然可以退出,所以它沒有阻塞主循環(huán)。神奇!.NET干得好。

100萬任務(wù)

現(xiàn)在我們來試試極限場(chǎng)景。

在100萬個(gè)任務(wù)時(shí),Elixir放棄了,提示 ** (SystemLimitError) a system limit has been reached。編輯:有些評(píng)論者指出我可以增加進(jìn)程限制。在elixir啟動(dòng)參數(shù)中添加--erl '+P 1000000'后,它運(yùn)行得很好。

ae05cf00-2062-11ee-962d-dac502259ad0.png

圖4:?jiǎn)?dòng)100萬個(gè)任務(wù)所需的峰值內(nèi)存

終于我們看到了C#程序內(nèi)存消耗的增加。但它仍然非常具有競(jìng)爭(zhēng)力。它甚至成功地稍稍擊敗了Rust的一個(gè)運(yùn)行時(shí)!

Go與其他程序之間的差距擴(kuò)大了。現(xiàn)在Go在勝利者面前輸?shù)袅顺^12倍。它還輸給了Java 2倍以上,這與人們普遍認(rèn)為JVM是內(nèi)存大戶,而Go輕量的觀念相矛盾。

Rust的tokio依然無可匹敵。在看過它在100k任務(wù)下的表現(xiàn)后,這并不令人驚訝。

最后的話

正如我們觀察到的,大量的并發(fā)任務(wù)可能會(huì)消耗大量的內(nèi)存,即使它們不執(zhí)行復(fù)雜的操作。不同的編程語言運(yùn)行時(shí)具有不同的取舍,有些在少量任務(wù)中表現(xiàn)輕量和高效,但在數(shù)十萬個(gè)任務(wù)中的擴(kuò)展性表現(xiàn)差。相反,其他一些具有高初始開銷的運(yùn)行時(shí)可以毫不費(fèi)力地應(yīng)對(duì)高負(fù)載。值得注意的是,并非所有運(yùn)行時(shí)都能在默認(rèn)設(shè)置下處理大量的并發(fā)任務(wù)。

這個(gè)比較僅關(guān)注內(nèi)存消耗,而任務(wù)啟動(dòng)時(shí)間和通信速度等其他因素同樣重要。值得注意的是,在100萬個(gè)任務(wù)時(shí),我觀察到啟動(dòng)任務(wù)的開銷變得明顯,大多數(shù)程序需要超過12秒才能完成。敬請(qǐng)期待即將到來的基準(zhǔn)測(cè)試,我將深入探討其他方面。

評(píng)論區(qū)

評(píng)論區(qū)也有很多大佬給出了建議,比較有意思,所以也翻譯了放在下方

JB-Dev

在C#實(shí)現(xiàn)中,你不需要調(diào)用Task.Run(...)。這會(huì)增加第二個(gè)任務(wù)延續(xù)的開銷。

在沒有額外開銷的情況下,我觀察到1M基準(zhǔn)測(cè)試的內(nèi)存使用量減少了一半以上,從428MB降到183MB(代碼在這里:https://github.com/J-Bax/CS...

例如,不要使用Task.Run(...)而是這樣做:

tasks.Add(Task.Delay(TimeSpan.FromMilliseconds(delayMillisec)));

Christoph Berger

Go的結(jié)果并不特別令人驚訝。

每個(gè)goroutine開始時(shí)的預(yù)分配棧為2KiB,所以一百萬個(gè)goroutine消耗大約2GB(2,048 * 1,000,000字節(jié))。

這與我使用go build&& /usr/bin/time -l ./goroutinememorybenchmark運(yùn)行測(cè)試代碼時(shí)得到的數(shù)字非常接近:

2044968960的最大常駐集大小

(我不確定圖中的2,658 GB是如何測(cè)量出來的,但數(shù)量級(jí)是相同的。)

毫無疑問,為每個(gè)goroutine預(yù)分配一個(gè)棧使Go在與那些在真正需要時(shí)才分配任何線程本地內(nèi)存的并發(fā)系統(tǒng)的語言相比處于劣勢(shì)。(附注:在這特定的上下文中,我將“線程”作為綠色或虛擬線程和goroutine的同義詞。)

我想,在線程做有實(shí)質(zhì)性工作的測(cè)試中,各種語言之間的差異可能會(huì)大大縮小。

D. Christoph Berge

我不完全了解后面發(fā)生了什么,但對(duì)于1000個(gè)Goroutine,Go只消耗每個(gè)goroutine約300字節(jié)。只有當(dāng)它增加到每個(gè)3000 Goroutine時(shí),它才開始每個(gè)Goroutine使用2KB。

Berger D.

你是如何得到這些測(cè)量結(jié)果的?

不幸的是,我無法復(fù)制你的發(fā)現(xiàn)。

為了獲得較小數(shù)量的goroutine的更準(zhǔn)確結(jié)果,我決定在每次測(cè)試運(yùn)行結(jié)束后讀取runtime.MemStats.StackInuse。

結(jié)果:

所有1000個(gè)goroutines完成。StackInuse:2,359,296(每個(gè)goroutine 2KB)

所有3000個(gè)goroutines完成。StackInuse:6,586,368(每個(gè)goroutine 2KB)

所有10000個(gè)goroutines完成。StackInuse:21,037,056(每個(gè)goroutine 2KB)

所有100000個(gè)goroutines完成。StackInuse:205,127,680(每個(gè)goroutine 2KB)

所有1000000個(gè)goroutines完成。StackInuse:2,048,622,592(每個(gè)goroutine 2KB)

Witek

對(duì)于Elixir / Erlang,默認(rèn)進(jìn)程限制為32k pids??梢酝ㄟ^解釋器標(biāo)志將其增加到20億。例如:erl +P 4000000,我編寫了一個(gè)小的Erlang程序來做你所做的事情(但確保在循環(huán)中不分配不必要的內(nèi)存),并且在1百萬個(gè)進(jìn)程中峰值RSS使用量為2.7GiB。然而,這仍然非常人工和合成。Erlang默認(rèn)為每個(gè)進(jìn)程分配額外的堆,因?yàn)樵诂F(xiàn)實(shí)生活中,您實(shí)際上會(huì)在進(jìn)程中執(zhí)行一些操作并需要一點(diǎn)內(nèi)存,因此預(yù)先分配比以后分配更快。如果您真的想在這個(gè)愚蠢的基準(zhǔn)測(cè)試中減少內(nèi)存使用量,您可以傳遞選項(xiàng)以spawn_opt,或使用自定義+h選項(xiàng)啟動(dòng)解釋器,例如。+h 10,或者+hms10(默認(rèn)值為?356)。這將將峰值RSS使用率從2.7 GiB降低到1.1 GiB。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7494

    瀏覽量

    87947
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3025

    瀏覽量

    74042
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1945

    瀏覽量

    34735
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3787

    瀏覽量

    81038
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    19954

原文標(biāo)題:不同語言運(yùn)行100萬個(gè)并發(fā)任務(wù)需要多少內(nèi)存?

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程并發(fā)概述

    并發(fā)模型是用來實(shí)現(xiàn)不同應(yīng)用場(chǎng)景中并發(fā)任務(wù)的編程模型,常見的并發(fā)模型分為基于內(nèi)存共享的并發(fā)模型和基
    發(fā)表于 03-22 15:40

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程并發(fā)概述

    并發(fā)模型是用來實(shí)現(xiàn)不同應(yīng)用場(chǎng)景中并發(fā)任務(wù)的編程模型,常見的并發(fā)模型分為基于內(nèi)存共享的并發(fā)模型和基
    發(fā)表于 03-28 14:35

    為何Python運(yùn)行效率低?python語言入門

    、Facebook、Redhat、Uber等都在大規(guī)模的使用Python完成各種任務(wù)!Python的用途越來越廣泛,很受歡迎,必然因?yàn)槠溆泻芏鄡?yōu)點(diǎn),但是Python也擁有一大缺點(diǎn),相比于C語言,Python運(yùn)行
    發(fā)表于 02-01 18:47

    并發(fā)、并行、進(jìn)程、線程和協(xié)程的區(qū)別

    首先是并發(fā),并發(fā)的概念是很早就有的了。最早的時(shí)候機(jī)器都是批處理系統(tǒng),而且是單道批處理系統(tǒng),這個(gè)系統(tǒng)就是很簡(jiǎn)單的線性邏輯,一個(gè)批處理任務(wù)進(jìn)去,完成,然后進(jìn)行下面一
    發(fā)表于 08-05 08:24

    C語言內(nèi)存運(yùn)行時(shí)不同變量是怎樣分配的

    C語言內(nèi)存運(yùn)行時(shí)不同變量是怎樣分配的?怎樣驗(yàn)證C語言編譯后的內(nèi)存地址分配是否合理?
    發(fā)表于 02-25 06:37

    Lite Actor:方舟Actor并發(fā)模型的輕量級(jí)優(yōu)化

    執(zhí)行的能力,如圖1所示,在一個(gè)時(shí)間段中可能有多個(gè)任務(wù)都處于已啟動(dòng)運(yùn)行運(yùn)行完畢之間,同時(shí),并發(fā)單元也可以在多核設(shè)備下并行執(zhí)行,可以極大地提高
    發(fā)表于 07-18 12:00

    ATC'22頂會(huì)論文RunD:高密高并發(fā)的輕量級(jí) Serverless 安全容器運(yùn)行時(shí) | 龍蜥技術(shù)

    RunD 已經(jīng)作為 Alibaba 的 Serverless 容器運(yùn)行時(shí),服務(wù)超過100 個(gè)函數(shù) ,每天調(diào)用近 40 億次。在線統(tǒng)計(jì)數(shù)據(jù)表明,RunD 使得每個(gè)節(jié)點(diǎn)的最大部署密度已
    發(fā)表于 09-05 15:18

    移動(dòng)應(yīng)用高級(jí)語言開發(fā)——并發(fā)探索

    共享,對(duì)基礎(chǔ)架構(gòu)進(jìn)行了輕量化處理,大幅提升了啟動(dòng)時(shí)間,且優(yōu)化了啟動(dòng)內(nèi)存。 ArkCompiler并發(fā)實(shí)例運(yùn)行 OpenHarmony也提供了TaskPool。TaskPool是一個(gè)
    發(fā)表于 08-28 17:08

    HarmonyOS使用多線程并發(fā)能力開發(fā)

    代表,不需要開發(fā)者去面對(duì)鎖帶來的一系列復(fù)雜偶發(fā)的問題,同時(shí)并發(fā)度也相對(duì)較高,因此得到了廣泛的支持和使用,也是當(dāng)前ArkTS語言選擇的并發(fā)模型。 由于Actor模型的
    發(fā)表于 09-25 15:23

    100個(gè)經(jīng)典C語言程序

    c語言編寫,c語言100個(gè)經(jīng)典程序,單片機(jī)的應(yīng)用,開發(fā)利用用
    發(fā)表于 12-17 11:46 ?11次下載

    100個(gè)經(jīng)典C語言程序資料

    100個(gè)經(jīng)典C語言程序資料,感興趣的可以看看。
    發(fā)表于 09-27 14:46 ?24次下載

    并發(fā)內(nèi)存池項(xiàng)目實(shí)現(xiàn)

    本項(xiàng)目實(shí)現(xiàn)了一個(gè)并發(fā)內(nèi)存池,參考了Google的開源項(xiàng)目tcmalloc實(shí)現(xiàn)的簡(jiǎn)易版;其功能就是實(shí)現(xiàn)高效的多線程內(nèi)存管理。由功能可知,高并發(fā)
    的頭像 發(fā)表于 11-09 11:16 ?720次閱讀
    高<b class='flag-5'>并發(fā)</b><b class='flag-5'>內(nèi)存</b>池項(xiàng)目實(shí)現(xiàn)

    接口調(diào)用并發(fā)執(zhí)行十個(gè)任務(wù)總結(jié)

    個(gè)接口調(diào)用時(shí),接收到一個(gè)列表,十個(gè)元素,需要并發(fā)執(zhí)行十個(gè)
    的頭像 發(fā)表于 11-15 10:37 ?451次閱讀

    C語言運(yùn)行環(huán)境是什么

    計(jì)算等多個(gè)領(lǐng)域。為了能夠正確、有效地運(yùn)行C語言程序,必須具備相應(yīng)的運(yùn)行環(huán)境。 C語言運(yùn)行環(huán)境包括軟件運(yùn)行
    的頭像 發(fā)表于 11-27 16:13 ?3509次閱讀

    “本源悟空”全球訪問量突破100,已完成14個(gè)運(yùn)算任務(wù)

    截至2月1日上午11時(shí),我國(guó)第三代自主超導(dǎo)量子計(jì)算機(jī)“本源悟空”已為全球94個(gè)國(guó)家和地區(qū)用戶成功完成142233個(gè)運(yùn)算任務(wù),全球遠(yuǎn)程訪問“悟空”人次已突破100
    的頭像 發(fā)表于 02-19 12:50 ?355次閱讀
    “本源悟空”全球訪問量突破<b class='flag-5'>100</b><b class='flag-5'>萬</b>,已完成14<b class='flag-5'>萬</b><b class='flag-5'>個(gè)</b>運(yùn)算<b class='flag-5'>任務(wù)</b>
    主站蜘蛛池模板: 亚洲国产欧美视频| 午夜两性网| 色噜噜噜噜| 成人伊人电影| 久久国内视频| 国产精品久久久久久久久免费观看 | 欧美.成人.综合在线| 又黄又爽又猛午夜性色播在线播放| avtom影院永久地址人人影院| 亚洲一级毛片免费观看| 激情六月婷婷| 久久15| 亚洲国产欧美日韩一区二区三区| 国内精品久久久久影院薰衣草| 国内精品久久久久影院免费| 在线观看精品国产福利片100| 韩国三级在线视频| 国产18到20岁美女毛片| 五月婷婷深爱五月| 成 黄 色 激 情视频网站| 啪啪网站免费看| 日韩高清毛片| 色综合色综合色综合网址| 精品精品国产自在久久高清| 久久婷婷国产精品香蕉| 国产精品午夜在线观看| 亚洲欧洲精品成人久久曰影片| 丁香花五月婷婷| sese亚洲| 模特视频一二三区| 久色国产| 四虎影视永久在线观看| 午夜看一级特黄a大片| 国产一区二区三区夜色| 国产精品伦视频观看免费| 日韩精品午夜| 日日干日日爽| 亚洲综合色就色手机在线观看| 成人欧美精品大91在线| 亚洲精品老司机综合影院| 久久国产综合|