精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux 中的負載高低和 CPU 開銷并不完全對應

系統 Linux
負載是查看 Linux 服務器運行狀態時很常用的一個性能指標。在觀察線上服務器運行狀況的時候,我們也是經常把負載找出來看一看。在線上請求壓力過大的時候,經常是也伴隨著負載的飆高。

大家好,我是飛哥!

負載是查看 Linux 服務器運行狀態時很常用的一個性能指標。在觀察線上服務器運行狀況的時候,我們也是經常把負載找出來看一看。在線上請求壓力過大的時候,經常是也伴隨著負載的飆高。

但是負載的原理你真的理解了嗎?我來列舉幾個問題,看看你對負載的理解是否足夠的深刻。

  • 負載是如何計算出來的?
  • 負載高低和 CPU 消耗正相關嗎?
  • 內核是如何暴露負載數據給應用層的?

如果你對以上問題的理解還拿捏不是很準,那么飛哥今天就帶你來深入地了解一下 Linux 中的負載

一、理解負載查看過程

我們經常用 top 命令查看 Linux 系統的負載情況。一個典型的 top 命令輸出的負載如下所示。

# top
Load Avg: 1.25, 1.30, 1.95 .....
......

輸出中的 Load Avg 就是我們常說的負載,也叫系統平均負載。因為單純某一個瞬時的負載值并沒有太大意義。所以 Linux 是計算了過去一段時間內的平均值,這三個數分別代表的是過去 1 分鐘、過去 5 分鐘和過去 15 分鐘的平均負載值。

那么 top 命令展示的數據數是如何來的呢?事實上,top 命令里的負載值是從 /proc/loadavg 這個偽文件里來的。通過 strace 命令跟蹤 top 命令的系統調用可以看的到這個過程。

# strace top
...
openat(AT_FDCWD, "/proc/loadavg", O_RDONLY) = 7

內核中定義了 loadavg 這個偽文件的 open 函數。當用戶態訪問 /proc/loadavg 會觸發內核定義的函數,在這里會讀取內核中的平均負載變量,簡單計算后便可展示出來。整體流程如下圖所示。

圖片

我們根據上述流程圖再展開了看下。偽文件 /proc/loadavg 在 kernel 中定義是在 /fs/proc/loadavg.c 中。在該文件中會創建 /proc/loadavg,并為其指定操作方法 loadavg_proc_fops。

//file: fs/proc/loadavg.c
static int __init proc_loadavg_init(void)
{
proc_create("loadavg", 0, NULL, &loadavg_proc_fops);
return 0;
}

在 loadavg_proc_fops 中包含了打開該文件時對應的操作方法。

//file: fs/proc/loadavg.c
static const struct file_operations loadavg_proc_fops = {
.open = loadavg_proc_open,
......
};

當在用戶態打開 /proc/loadavg 文件時,都會調用 loadavg_proc_fops 中的 open 函數指針 - loadavg_proc_open。loadavg_proc_open 接下來會調用 loadavg_proc_show 進行處理,核心的計算是在這里完成的。

//file: fs/proc/loadavg.c
static int loadavg_proc_show(struct seq_file *m, void *v)
{
unsigned long avnrun[3];

//獲取平均負載值
get_avenrun(avnrun, FIXED_1/200, 0);

//打印輸出平均負載
seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
nr_running(), nr_threads,
task_active_pid_ns(current)->last_pid);
return 0;
}

在 loadavg_proc_show 函數中做了兩件事。

  • 調用 get_avenrun 讀取當前負載值
  • 將平均負載值按照一定的格式打印輸出

在上面的源碼中,大家看到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪怪的定義,代碼寫的這么猥瑣是因為內核中并沒有 float、double 等浮點數類型,而是用整數來模擬的。這些代碼都是為了在整數和小數之間轉化使的。知道這個背景就行了,不用過度展開剖析。

這樣用戶通過訪問 /proc/loadavg 文件就可以讀取到內核計算的負載數據了。其中獲取 get_avenrun 只是在訪問 avenrun 這個全局數組而已。

//file:kernel/sched/core.c
void get_avenrun(unsigned long *loads, unsigned long offset, int shift)
{
loads[0] = (avenrun[0] + offset) << shift;
loads[1] = (avenrun[1] + offset) << shift;
loads[2] = (avenrun[2] + offset) << shift;
}

現在可以總結一下我們開篇中的一個問題: 內核是如何暴露負載數據給應用層的?

內核定義了一個偽文件 /proc/loadavg,每當用戶打開這個文件的時候,內核中的 loadavg_proc_show 函數就會被調用到,接著訪問 avenrun 全局數組變量 并將平均負載從整數轉化為小數,并打印出來。

好了,另外一個新問題又來了,avenrun 全局數組變量中存儲的數據是何時,又是被如何計算出來的呢?

二、內核中負載的計算過程

接上小節,我們繼續查看 avenrun 全局數組變量的數據來源。這個數組的計算過程分為如下兩步:

1.PerCPU 定期匯總瞬時負載:定時刷新每個 CPU 當前任務數到 calc_load_tasks,將每個 CPU 的負載數據匯總起來,得到系統當前的瞬時負載。
2.定時計算系統平均負載:定時器根據當前系統整體瞬時負載,使用指數加權移動平均法(一種高效計算平均數的算法)計算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載。

接下來我們分成兩個小節來分別介紹。

2.1 PerCPU 定期匯總負載

在 Linux 內核中,有一個子系統叫做時間子系統。在時間子系統里,初始化了一個叫高分辨率的定時器。在該定時器中會定時將每個 CPU 上的負載數據(running 進程數 + uninterruptible 進程數)匯總到系統全局的瞬時負載變量 calc_load_tasks 中。整體流程如下圖所示。

圖片

我們把上述流程圖展開看一下,我們找到了高分辨率定時器的源碼如下:

//file:kernel/time/tick-sched.c
void tick_setup_sched_timer(void)
{
//初始化高分辨率定時器 sched_timer
hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);

//將定時器的到期函數設置成 tick_sched_timer
ts->sched_timer.function = tick_sched_timer;
...
}

在高分辨率初始化的時候,將到期函數設置成了 tick_sched_timer。通過這個函數讓每個 CPU 都會周期性地執行一些任務。其中刷新當前系統負載就是在這個時機進行的。這里有一點要注意一個前提是每個 CPU 都有自己獨立的運行隊列,。

我們根據 tick_sched_timer 的源碼進行追蹤,它依次通過調用 tick_sched_handle => update_process_times => scheduler_tick。最終在 scheduler_tick 中會刷新當前 CPU 上的負載值到 calc_load_tasks 上。因為每個 CPU 都在定時刷,所以 calc_load_tasks 上記錄的就是整個系統的瞬時負載值。

我們來看下負責刷新的 scheduler_tick 這個核心函數:

//file:kernel/sched/core.c
void scheduler_tick(void)
{
int cpu = smp_processor_id();
struct rq *rq = cpu_rq(cpu);
update_cpu_load_active(rq);
...
}

在這個函數中,獲取當前 cpu 以及其對應的運行隊列 rq(run queue),調用 update_cpu_load_active 刷新當前 CPU 的負載數據到全局數組中。

//file:kernel/sched/core.c
static void update_cpu_load_active(struct rq *this_rq)
{
...
calc_load_account_active(this_rq);
}

//file:kernel/sched/core.c
static void calc_load_account_active(struct rq *this_rq)
{
//獲取當前運行隊列的負載相對值
delta = calc_load_fold_active(this_rq);
if (delta)
//添加到全局瞬時負載值
atomic_long_add(delta, &calc_load_tasks);
...
}

在 calc_load_account_active 中看到,通過 calc_load_fold_active 獲取當前運行隊列的負載相對值,并把它加到全局瞬時負載值 calc_load_tasks 上。至此,calc_load_tasks 上就有了當前系統當前時間下的整體瞬時負載總數了。

我們再展開看看是如何根據運行隊列計算負載值的:

//file:kernel/sched/core.c
static long calc_load_fold_active(struct rq *this_rq)
{
long nr_active, delta = 0;

// R 和 D 狀態的用戶 task
nr_active = this_rq->nr_running;
nr_active += (long) this_rq->nr_uninterruptible;

// 只返回變化的量
if (nr_active != this_rq->calc_load_active) {
delta = nr_active - this_rq->calc_load_active;
this_rq->calc_load_active = nr_active;
}

return delta;
}

哦,原來是同時計算了 nr_running 和 nr_uninterruptible 兩種狀態的進程的數量。對應于用戶空間中的 R 和 D 兩種狀態的 task 數(進程 OR 線程)。

由于 calc_load_tasks 是一個長期存在的數據。所以在刷新 rq 里的進程數到其上的時候,只需要刷變化的量就行,不用全部重算。因此上述函數返回的是一個 delta。

2.2 定時計算系統平均負載

上一小節中我們找到了系統當前瞬時負載 calc_load_tasks 變量的更新過程。現在我們還缺一個計算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘平均負載的機制。

傳統意義上,我們在計算平均數的時候采取的方法都是把過去一段時間的數字都加起來然后平均一下。把過去 N 個時間點的所有瞬時負載都加起來取一個平均數不完事了。這其實是我們傳統意義上理解的平均數,假如有 n 個數字,分別是 x1, x2, ..., xn。那么這個數據集合的平均數就是 (x1 + x2 + ... + xn) / N。

但是如果用這種簡單的算法來計算平均負載的話,存在以下幾個問題:

1.需要存儲過去每一個采樣周期的數據
假設我們每 10 毫秒都采集一次,那么就需要使用一個比較大的數組將每一次采樣的數據全部都存起來,那么統計過去 15 分鐘的平均數就得存 1500 個數據(15 分鐘 * 每分鐘 100 次) 。而且每出現一個新的觀察值,就要從移動平均中減去一個最早的觀察值,再加上一個最新的觀察值,內存數組會頻繁地修改和更新。

2.計算過程較為復雜
計算的時候再把整個數組全加起來,再除以樣本總數。雖然加法很簡單,但是成百上千個數字的累加仍然很是繁瑣。

3.不能準確表示當前變化趨勢傳統的平均數計算過程中,所有數字的權重是一樣的。但對于平均負載這種實時應用來說,其實越靠近當前時刻的數值權重應該越要大一些才好。因為這樣能更好反應近期變化的趨勢。

所以,在 Linux 里使用的并不是我們所以為的傳統的平均數的計算方法,而是采用的一種指數加權移動平均(Exponential Weighted Moving Average,EMWA)的平均數計算法。

這種指數加權移動平均數計算法在深度學習中有很廣泛的應用。另外股票市場里的 EMA 均線也是使用的是類似的方法求均值的方法。該算法的數學表達式是:a1 = a0 * factor + a * (1 - factor)。這個算法想理解起來有點小復雜,感興趣的同學可以 Google 自行搜索。

我們只需要知道這種方法在實際計算的時候只需要上一個時間的平均數即可,不需要保存所有瞬時負載值。另外就是越靠近現在的時間點權重越高,能夠很好地表示近期變化趨勢。

這其實也是在時間子系統中定時完成的,通過一種叫做指數加權移動平均計算的方法,計算這三個平均數。

圖片

我們來詳細看下上圖中的執行過程。時間子系統將在時鐘中斷中會注冊時鐘中斷的處理函數為 timer_interrupt 。

//file:arch/ia64/kernel/time.c
void __init
time_init (void)
{
register_percpu_irq(IA64_TIMER_VECTOR, &timer_irqaction);
ia64_init_itm();
}

static struct irqaction timer_irqaction = {
.handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_IRQPOLL,
.name = "timer"
};

當每次時鐘節拍到來時會調用到 timer_interrupt,依次會調用到 do_timer 函數。

//file:kernel/time/timekeeping.c
void do_timer(unsigned long ticks)
{
...
calc_global_load(ticks);
}

其中 calc_global_load 是平均負載計算的核心。它會獲取系統當前瞬時負載值 calc_load_tasks,然后來計算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載,并保存到 avenrun 中,供用戶進程讀取。

//file:kernel/sched/core.c
void calc_global_load(unsigned long ticks)
{
...
// 1.獲取當前瞬時負載值
active = atomic_long_read(&calc_load_tasks);

// 2.平均負載的計算
avenrun[0] = calc_load(avenrun[0], EXP_1, active);
avenrun[1] = calc_load(avenrun[1], EXP_5, active);
avenrun[2] = calc_load(avenrun[2], EXP_15, active);
...
}

獲取瞬時負載比較簡單,就是讀取一個內存變量而已。在 calc_load 中就是采用了我們前面說的指數加權移動平均法來計算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載的。具體實現的代碼如下:

//file:kernel/sched/core.c
/*
* a1 = a0 * e + a * (1 - e)
*/
static unsigned long
calc_load(unsigned long load, unsigned long exp, unsigned long active)
{
load *= exp;
load += active * (FIXED_1 - exp);
load += 1UL << (FSHIFT - 1);
return load >> FSHIFT;
}

雖然這個算法理解起來挺復雜,但是代碼看起來確實要簡單不少,計算量看起來很少。而且看不懂也沒有關系,只需要知道內核并不是采用的原始的平均數計算方法,而是采用了一種計算快,且能更好表達變化趨勢的算法就行。

至此,我們開篇提到的“負載是如何計算出來的?”這個問題也有結論了。

Linux 定時將每個 CPU 上的運行隊列中 running 和 uninterruptible 的狀態的進程數量匯總到一個全局系統瞬時負載值中,然后再定時使用指數加權移動平均法來統計過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載。

三、平均負載和 CPU 消耗的關系

現在很多同學都將平均負載和 CPU 給聯系到了一起。認為負載高、CPU 消耗就會高,負載低,CPU 消耗就會低。

在很老的 Linux 的版本里,統計負載的時候確實是只計算了 runnable 的任務數量,這些進程只對 CPU 有需求。在那個年代里,負載和 CPU 消耗量確實是正相關的。負載越高就表示正在 CPU 上運行,或等待 CPU 執行的進程越多,CPU 消耗量也會越高。

但是前面我們看到了,本文使用的 3.10 版本的 Linux 負載平均數不僅跟蹤 runnable 的任務,而且還跟蹤處于 uninterruptible sleep 狀態的任務。而 uninterruptible 狀態的進程其實是不占 CPU 的。

圖片

?所以說,負載高并一定是 CPU 處理不過來,也有可能會是因為磁盤等其他資源調度不過來而使得進程進入 uninterruptible 狀態的進程導致的!

為什么要這么修改。我從網上搜到了遠在 1993 年的一封郵件里找到了原因,以下是郵件原文。

From: Matthias Urlichs <urlichs@smurf.sub.org>
Subject: Load average broken ?
Date: Fri, 29 Oct 1993 11:37:23 +0200


The kernel only counts "runnable" processes when computing the load average.
I don't like that; the problem is that processes which are swapping or
waiting on "fast", i.e. noninterruptible, I/O, also consume resources.

It seems somewhat nonintuitive that the load average goes down when you
replace your fast swap disk with a slow swap disk...

Anyway, the following patch seems to make the load average much more
consistent WRT the subjective speed of the system. And, most important, the
load is still zero when nobody is doing anything. ;-)


--- kernel/sched.c.orig Fri Oct 29 10:31:11 1993
+++ kernel/sched.c Fri Oct 29 10:32:51 1993
@@ -414,7 +414,9 @@
unsigned long nr = 0;

for(p = &LAST_TASK; p > &FIRST_TASK; --p)
- if (*p && (*p)->state == TASK_RUNNING)
+ if (*p && ((*p)->state == TASK_RUNNING) ||
+ (*p)->state == TASK_UNINTERRUPTIBLE) ||
+ (*p)->state == TASK_SWAPPING))
nr += FIXED_1;
return nr;
}

可見這個修改是在 1993 年就引入了。在這封郵件所示的 Linux 源碼變化中可以看到,負載正式把 TASK_UNINTERRUPTIBLE 和 TASK_SWAPPING 狀態(交換狀態后來從 Linux 中刪除)的進程也給添加了進來。在這封郵件中的正文中,作者也清楚地表達了為什么要把 TASK_UNINTERRUPTIBLE 狀態的進程添加進來的原因。我把他的說明翻譯一下,如下:

“內核在計算平均負載時只計算“可運行”進程。我不喜歡那樣;問題是正在“快速”交換或等待的進程,即不可中斷的 I/O,也會消耗資源。當您用慢速交換磁盤替換快速交換磁盤時,平均負載下降似乎有點不直觀...... 無論如何,下面的補丁似乎使負載平均值更加一致 WRT 系統的主觀速度。而且,最重要的是,當沒有人做任何事情時,負載仍然為零。;-)”

這一補丁提交者的主要思想是平均負載應該表現對系統所有資源的需求情況,而不應該只表現對 CPU 資源的需求。

假設某個 TASK_UNINTERRUPTIBLE 狀態的進程因為等待磁盤 IO 而排隊的話,此時它并不消耗 CPU,但是正在等磁盤等硬件資源。那么它是應該體現在平均負載的計算里的。所以作者把 TASK_UNINTERRUPTIBLE 狀態的進程都表現到平均負載里了。

所以,負載高低表明的是當前系統上對系統資源整體需求更情況。如果負載變高,可能是 CPU 資源不夠了,也可能是磁盤 IO 資源不夠了,所以還需要配合其它觀測命令具體分情況分析。

四、總結

今天我帶大家深入地學習了一下 Linux 中的負載。我們根據一幅圖來總結一下今天學到的內容。

圖片

我把負載工作原理分成了如下三步。

  • 1.內核定時匯總每 CPU 負載到系統瞬時負載
  • 2.內核使用指數加權移動平均快速計算過去1、5、15分鐘的平均數
  • 3.用戶進程通過打開 loadavg 讀取內核中的平均負載

我們再回頭來總結一下開篇提到的幾個問題。

1.負載是如何計算出來的?
是定時將每個 CPU 上的運行隊列中 running 和 uninterruptible 的狀態的進程數量匯總到一個全局系統瞬時負載值中,然后再定時使用指數加權移動平均法來統計過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載。

2.負載高低和 CPU 消耗正相關嗎?
負載高低表明的是當前系統上對系統資源整體需求更情況。如果負載變高,可能是 CPU 資源不夠了,也可能是磁盤 IO 資源不夠了。所以不能說看著負載變高,就覺得是 CPU 資源不夠用了。

3.內核是如何暴露負載數據給應用層的?
內核定義了一個偽文件 /proc/loadavg,每當用戶打開這個文件的時候,內核中的 loadavg_proc_show 函數就會被調用到,該函數中訪問 avenrun 全局數組變量,并將平均負載從整數轉化為小數,然后打印出來。


責任編輯:武曉燕 來源: 開發內功修煉
相關推薦

2024-04-22 08:49:29

CIO人工智能云計算

2015-09-01 10:42:15

編程規范完全指南

2017-04-13 08:46:41

oracle數據挖掘

2015-10-10 10:02:44

程序員面試指南

2021-06-01 06:03:28

Css前端CSS 特效

2014-09-19 10:03:18

Chrome

2024-01-02 16:43:58

2011-06-29 10:03:33

Qt Configure

2024-01-12 10:16:53

2019-07-04 08:47:57

JavaScript瀏覽器技術

2021-05-06 07:26:55

CSS 文字動畫技巧

2021-02-09 00:46:45

區塊鏈加密貨幣工具

2019-04-12 15:00:11

2017-04-19 20:10:20

SQLJOIN

2021-08-18 10:28:09

MySQL SQL 語句數據庫

2019-08-19 16:01:59

Rust編程語言JavaScript

2025-04-30 06:55:30

AI人工智能直播

2019-08-18 22:45:22

編程Rust語言

2020-07-22 08:01:13

Nginx服務器網絡

2011-05-12 10:49:39

點贊
收藏

51CTO技術棧公眾號

国产精品69av| 精品国产露脸精彩对白| 一区二区精品在线| 国产丝袜视频在线观看| 国色天香一区二区| 日韩电影中文 亚洲精品乱码| 18禁免费无码无遮挡不卡网站| 日韩二区三区| 热久久一区二区| 久久av红桃一区二区小说| 制服丝袜在线第一页| 成人私拍视频| 最好看的中文字幕久久| 国产中文一区二区| 中文字幕观看在线| 欧美日韩爆操| 在线精品视频视频中文字幕| 麻豆精品国产传媒| 涩涩av在线| 亚洲品质自拍视频| 日韩av一级大片| 精品人妻伦一二三区久久| 国产精品毛片在线看| 日日狠狠久久偷偷四色综合免费| 无套白嫩进入乌克兰美女| xxxxxx欧美| 亚洲一区二区中文在线| 天堂av一区二区| 天天干天天摸天天操| 极品少妇一区二区| 国产成人黄色av| 国产精品19乱码一区二区三区| 国产中文字幕一区二区三区| 精品福利在线导航| www.午夜av| 亚洲mmav| 精品欧美激情精品一区| 久久久99精品视频| 亚洲精品传媒| 国产视频一区不卡| 黄色99视频| 亚洲AV无码精品国产| 久久激情五月婷婷| 国产精品免费久久久久久| av中文在线播放| 激情婷婷亚洲| 欧美日韩爱爱视频| 麻豆天美蜜桃91| 成人亚洲一区二区| 一本色道久久88精品综合| 日本免费福利视频| 精品少妇3p| 欧美成人精品福利| 欧美69精品久久久久久不卡| 成人污版视频| 欧美一区二区三区在| 国产一伦一伦一伦| 成人一区视频| 欧美日韩国产综合草草| 网站一区二区三区| 久久久久久久性潮| 色婷婷精品久久二区二区蜜臂av| 久久无码高潮喷水| 伊人久久综合一区二区| 色婷婷综合久久久久中文| 无罩大乳的熟妇正在播放| 黄色视屏在线免费观看| 天天射综合影视| 六月丁香激情网| 成人免费看视频网站| 欧洲精品一区二区三区在线观看| 波多野结衣作品集| 久久电影天堂| 日韩欧美国产成人一区二区| 国产清纯白嫩初高中在线观看性色| 一区二区三区视频播放| 亚洲精品在线一区二区| 亚洲熟女乱综合一区二区三区| 欧美久久精品| 亚洲片av在线| 四虎影视一区二区| 综合av在线| 97视频在线免费观看| 亚洲国产成人无码av在线| 日韩二区三区在线观看| 成人精品在线观看| 国产suv一区二区| av网站免费线看精品| 欧美一进一出视频| 黄色一级大片在线免费看产| 亚洲综合成人在线| 啊啊啊一区二区| 91精品国产66| 欧美成人国产一区二区| 蜜臀av一区二区三区有限公司| 国产精品手机在线播放| 超碰精品一区二区三区乱码| 日韩成人免费在线观看| 免费成人在线观看视频| 不卡的av一区| 激情小视频在线| 亚洲欧美一区二区三区极速播放| 老子影院午夜伦不卡大全| 国产精品亚洲一区二区三区在线观看| 8x8x8国产精品| 内射中出日韩无国产剧情| 日韩免费久久| 777777777亚洲妇女| 亚洲天堂中文在线| 99re热这里只有精品免费视频| 五月天亚洲综合小说网| av资源网在线播放| 欧美日韩国产高清一区二区| 国产精品九九视频| 99精品综合| 国产91在线播放精品91| 亚洲成人第一区| 中文字幕av免费专区久久| 欧洲精品一区二区三区久久| 色噜噜成人av在线| 亚洲精品视频在线播放| 免看一级a毛片一片成人不卡| 久久蜜桃精品| 国产综合精品一区二区三区| 美女写真理伦片在线看| 色呦呦国产精品| 成年女人免费视频| 91tv官网精品成人亚洲| 国产ts人妖一区二区三区 | 日韩人妻一区二区三区| 欧美在线免费| 国产欧美欧洲在线观看| 激情在线视频| 色综合av在线| 亚洲精品理论片| 极品少妇一区二区三区| 亚洲自拍偷拍视频| 美女免费久久| 欧美一区三区四区| 欧美一区二区三区观看| 首页国产欧美久久| 欧美激情导航| 国产免费不卡| 亚洲精品视频在线播放| 久久久久99精品成人片我成大片| 国产在线视视频有精品| 午夜视频久久久| 校园春色亚洲色图| 亚洲视频999| 亚洲天堂av片| 久久久午夜精品理论片中文字幕| 毛片在线播放视频| 欧美aaaaa级| 国产91精品久久久| 同心难改在线观看| 亚洲国产日韩一区二区| 久草免费资源站| 激情综合亚洲| 精品日本一区二区三区| 久草在线资源站手机版| 欧美成人艳星乳罩| 国产污片在线观看| 91首页免费视频| 37pao成人国产永久免费视频| 日韩最新在线| 国产精品福利在线观看| 日韩三级影院| 制服.丝袜.亚洲.中文.综合| 天天综合天天做| 国产精品一区二区三区乱码| 成人小视频在线观看免费| www.久久东京| 欧美一区二区三区四区在线| 你懂得在线网址| 欧美亚洲综合色| 很污很黄的网站| 国产精品一区二区你懂的| 国产日韩欧美精品在线观看| 性欧美lx╳lx╳| 国产精品视频一| 黄色在线播放网站| 欧美精品一区二区高清在线观看| 欧美一区二区三区四| 中文字幕 久热精品 视频在线| 一级做a免费视频| 亚洲成人原创| 日韩av不卡在线播放| 国产日韩在线观看视频| 97色在线观看免费视频| 草草影院在线观看| 日韩欧美在线观看一区二区三区| 日韩人妻无码一区二区三区99| 国产日韩欧美a| 男生和女生一起差差差视频| 国产精品外国| 亚洲最新在线| 欧美freesex8一10精品| 国产在线观看精品| 国产99在线| www国产亚洲精品久久网站| 欧美视频久久久| 欧美亚洲国产一区二区三区va| 久久久www成人免费毛片| 国产一区福利| 国产精品任我爽爆在线播放| 欧美在线免费一级片| 波多野结衣的一区二区三区| 欧美激情777| 欧美亚洲在线日韩| 99热在线成人| 午夜日韩福利| 亚洲影视综合| 美女在线视频一区| 精彩视频一区二区三区| 亚洲黄色片网站| 日韩手机在线观看| 国产精品亲子伦对白| 午夜男人的天堂| 国产在线精品一区二区不卡了| av免费观看网| 欧美成人69| 亚洲日本精品| 你懂的视频欧美| 国产一区二区三区四区hd| 国产情侣一区在线| 国产日产欧美精品| 在线天堂资源www在线污| 欧美成人精品在线播放| aiai在线| 亚洲网站在线看| 四虎成人免费在线| 亚洲电影中文字幕| 成人久久久精品国产乱码一区二区 | 91精品国产综合久久男男| 1区2区3区在线视频| 一色桃子一区二区| 免费福利在线观看| 亚洲精品电影网在线观看| 国产黄色片网站| 91精品国产综合久久精品麻豆| 91丨九色丨海角社区| 日韩欧美国产免费播放| 日韩久久久久久久久| 亚洲国产精品一区二区www在线| 午夜剧场免费在线观看| 中文字幕一区av| 亚洲一级理论片| 国产精品免费视频一区| 香蕉久久久久久久| 国产精品乱人伦| 中文字幕乱码av| 国产精品理伦片| 色哟哟一一国产精品| 亚洲欧洲国产日本综合| 中国毛片直接看| 亚洲免费伊人电影| 美女视频黄免费| 夜夜嗨av一区二区三区| 久久网一区二区| 亚洲第一激情av| www..com国产| 日本丶国产丶欧美色综合| 日韩电影在线观看一区二区| 欧美性色欧美a在线播放| 中国女人一级一次看片| 欧美嫩在线观看| 99热这里只有精品9| 日韩欧美国产精品| 无码h黄肉3d动漫在线观看| 国产婷婷成人久久av免费高清| 青青九九免费视频在线| 尤物九九久久国产精品的分类| 色影院视频在线| 美女久久久久久久久久久| 日韩av毛片| 日本精品视频在线| 久久亚洲人体| 91久久精品一区二区别| 精品网站aaa| 三区精品视频| 午夜日本精品| 精品中文字幕av| 免费人成精品欧美精品| 在线观看一区二区三区视频| 99视频一区二区三区| 亚洲色成人网站www永久四虎| 中文字幕一区二区三区不卡 | 亚洲国产日韩av| 国产成人精品777777| 9191久久久久久久久久久| 涩涩视频免费看| 中文日韩在线视频| 国内在线免费视频| 全球成人中文在线| 99视频这里有精品| 精品视频在线观看| 999久久久精品国产| 亚洲色成人www永久在线观看| 天堂蜜桃91精品| 苍井空张开腿实干12次| 国产喂奶挤奶一区二区三区| 成人观看免费视频| 欧美性色欧美a在线播放| 六月丁香色婷婷| 色哟哟网站入口亚洲精品| 国产亚洲精品超碰| 91精品久久久久久久久久久久| 一区二区三区在线看| 精品视频一二三区| 精品国产乱码久久| 永久免费在线观看视频| 68精品国产免费久久久久久婷婷| 99精品国产九九国产精品| 久久大香伊蕉在人线观看热2| 亚洲影视一区| 91国产精品视频在线观看| 9色porny自拍视频一区二区| 免费国产羞羞网站美图| 欧美性受极品xxxx喷水| 亚洲av片一区二区三区| 欧美国产亚洲视频| 日韩深夜福利网站| 区一区二区三区中文字幕| 亚洲国产高清一区二区三区| 亚洲精品第三页| 国产亚洲精久久久久久| 天天插天天操天天干| 日韩欧美一区二区视频| 97最新国自产拍视频在线完整在线看| 5566成人精品视频免费| 91亚洲无吗| 国产激情片在线观看| 国产一二精品视频| 91av手机在线| 精品视频在线免费看| 国产三级在线观看| 国产福利精品视频| 久久av影视| 国产男女激情视频| 久久久噜噜噜久久人人看 | 免费a v网站| 一级中文字幕一区二区| 亚洲国产成人一区二区| 欧美精品性视频| 久久久久久爱| 裸体大乳女做爰69| 国产伦精品一区二区三区在线观看| 国产一区二区三区视频播放| 欧美日韩综合在线| av在线电影院| 国产专区欧美专区| 91久久高清国语自产拍| 久久精品一卡二卡| 亚洲乱码中文字幕| 性欧美videos另类hd| 欧美激情手机在线视频| 豆花视频一区二区| 成人中文字幕在线播放| 99精品国产视频| 国产精品第5页| 中文字幕欧美日韩| 欧洲亚洲精品| 8x8x华人在线| 成人免费视频视频| 精品91久久久| 亚洲精品在线不卡| 88xx成人网| 亚洲午夜精品一区二区三区| 精品无人码麻豆乱码1区2区| 亚洲最大的黄色网址| 精品国产乱码久久久久久影片| 999福利在线视频| 欧美久久电影| 久久精品国产亚洲高清剧情介绍| 日韩欧美综合视频| 亚洲精品国产精品国自产观看浪潮| 欧美激情喷水| 少妇熟女一区二区| 成人h精品动漫一区二区三区| 亚洲影院在线播放| 中文字幕亚洲一区二区三区五十路| 国产电影一区| 玩弄中年熟妇正在播放| 国产亚洲精品资源在线26u| 国产偷人妻精品一区二区在线| 欧美黄色片视频| 九一精品国产| 又黄又爽又色的视频| 欧美性极品少妇精品网站| 在线视频自拍| 国产精品免费观看高清| 日韩电影免费在线看| 超碰手机在线观看| 亚洲精品小视频在线观看| 欧美一级做a| 极品粉嫩国产18尤物| 国产精品丝袜一区| 天堂中文网在线| 国产精品男人爽免费视频1| 欧美午夜一区|