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

我的服務程序被 SIGPIPE 信號給搞崩了!

開發 前端
Golang 為了避免網絡斷連把程序搞崩在語言運行時中,設置了對非 0、1 文件句柄的默認處理行為為忽略。但是對于我使用的 Go 在進程內通過 cgo 訪問 Rust 代碼的情況并沒有很好地處理。

就在前幾天,我們在灰度上線時遇到了一個服務程序閃退的問題。最后排查的結果是因為一個小小的網絡 SIGPIPE 信號導致的這個嚴重問題。

今天,我就用一篇文章來介紹下 SIGPIPE 信號是如何發生的、為啥該信號會導致進程的閃退、遇到這種問題該如何解決。

讓我們開啟今天的內核原理學習之旅!

故障背景

我們對某個核心 Go 服務進行了 Rust 重構。由于源碼太多,全部重構又不太現實。所以我們采用的方案是將部分代碼用 Rust 重構掉。在服務進程中,Go 和 Rust 通過 cgo 進行通信。

但該新服務在線上遇到了崩潰的問題。而且崩潰還不是因為它自己,而是它依賴的另一個業務進程熱升級的時候出現的。只要對該依賴熱升級,就會導致該新服務崩潰退出,進而導致線上 SLA 出現較為嚴重的下降。

好在是灰度階段,影響不大。當時臨時禁止熱升級后規避了這個問題。但服務進程有概率崩潰終究可不是小事,萬一哪天誰不知道,一把線上梭哈升級那可就完犢子了。于是我立即停下了所有手頭的工作,幫大伙兒開始排查這個問題。

遇到這種問題,大家第一反應是看日志。但不幸的是在業務日志中沒有找到任何線索。然后我的思路是找 coredump 文件單步調試一下,看看崩潰發生在代碼的哪一行,結果發現這次崩潰連 core 文件都沒有留下,悄無聲息的就消失了。

經過七七四十九小時的激情排查后,最終的發現竟然是因為一個小小的網絡 SIGPIPE 信號導致的。接下來修改代碼,通過設置進程對 SIGPIPE 信號處理方式為 SIGIGN(忽略) 后徹底根治了該問題。

問題是解決了。但我還不滿足,想正好借此機會深入地給大家介紹一下內核中信號的工作原理。抽了周末整整兩天,寫出了本篇文章。

接下來的文章我分三大部分給大家講解:

  • SIGPIPE 信號是如何發生的,帶大家看看為什么連接異常會導致 SIGPIPE 的發生
  • 內核 SIGPIPE 信號處理流程,帶大家看看為什么內核默認遇到 SIGPIPE 時會將應用給殺死
  • 應用層該如何應對 SIGPIPE,帶大家看語言運行時以及我們自己的程序如何規避該問題

一、SIGPIPE 信號如何發生

但內核對象是不允許我們隨便訪問的。我們平時在用戶態程序中看到的 socket 其實只是一個句柄而已,并不是真正的 socket 對象。

假如由于網絡、對端重啟等問題這條 TCP 連接斷開了。此時我們的用戶態程序根本是不知情的。很有可能還會調用 send、write 等系統調用往 socket 里面發送數據。

圖片圖片

當數據包發送過程走到內核中的時候,內核是知道這個 socket 已經斷開了的。就會給當前進程發送一個 SIGPIPE 信號。

我們來看下具體的源碼。內核的發送會走到 do_tcp_sendpages 函數,在這里內核如果發現該 socket 已經 在這種情況下,會調用 sk_stream_error 函數。

//file:net/core/stream.c
ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset,
    size_t size, int flags)
{
 ......
 err = -EPIPE;
 if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
  goto out_err;
out_err:
 return sk_stream_error(sk, flags, err);
}

sk_stream_error 函數主要工作就是給正在 current(發送數據的進程)發送一個 SIGPIPE 信號。

int sk_stream_error(struct sock *sk, int flags, int err)
{
 ......
 if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
  send_sig(SIGPIPE, current, 0);
 return err;
}

二、內核 SIGPIPE 信號處理流程

上一節我們看到如果遇到網絡連接異常斷開,內核會給當前進程發送一個 SIGPIPE 信號。那么為啥這個信號就能把服務程序給搞崩而且沒留下 coredump 文件呢?

簡單來說,這是 Linux 內核對 SIGPIPE 信號處理的默認行為。飛哥喝口水,接著給你說。

目標進程每當從內核態返回用戶態的過程中,會檢測是否有掛起的信號。如果有信號存在,就會進入到信號的處理過程中,會執行到 do_notify_resume,然后再進到核心函數 do_signal。我們直接把 do_signal 的源碼翻出來。

//file:arch/x86/kernel/signal.c
static void do_signal(struct pt_regs *regs)
{
 struct ksignal ksig;
 ...
 if (get_signal(&ksig)) {
  /* Whee!  Actually deliver the signal.  */
  handle_signal(&ksig, regs);
  return;
 }
 ...
}

在 do_signal 主要包含 get_signal 和 handle_signal 兩個操作。

內核在 get_signal 中是獲取一個信號。值得注意的是,內核獲取到信號后,還會判斷信號的關聯行為。如果發現這個信號內核可以處理,內核直接就操作了。

如果內核發現獲得到的信號內核需要交接給用戶態程序處理,才會在 get_signal 函數中返回。接著再把信號交給 handle_signal 函數,由該函數來為用戶空間準備好處理信號的環境,進行后面的處理。

服務程序在收到 SIGPIPE 會導致進程崩潰的關鍵就藏在這個 get_signal 函數里。

//file:kernel/signal.c
bool get_signal(struct ksignal *ksig)
{
 ...
 for (;;) {
  // 1.取出信號
  signr = dequeue_synchronous_signal(&ksig->info);
  if (!signr)
   signr = dequeue_signal(current, ¤t->blocked,
           &ksig->info, &type);

  // 2.判斷用戶進程是否為信號配置了 handler
  // 2.1 如果是 SIG_IGN(ignore的縮寫),就跳過
  if (ka->sa.sa_handler == SIG_IGN) 
   continue;

  // 2.3 判斷如果不是 SIG_DFL(default的縮寫),
  //     則證明用戶定義了處理函數,break 退出循環后返回信號對象
  if (ka->sa.sa_handler != SIG_DFL) {
   ksig->ka = *ka;
   ...
   break; 
  }

  // 3.接下來就是內核的默認行為了
  ......
 }
out:
 ksig->sig = signr; 
 return ksig->sig > 0;
}

在 get_signal 函數里主要做了三件事。

  • 一是通過 dequeue_xxx 函數來獲取一個信號
  • 二是判斷下用戶進程是否為信號配置了 handler。如果用戶配置的是 SIG_IGN 直接跳過就行了,如果配置了處理函數,get_signal 就會將信號返回交給后面的流程交給用戶態程序執行。
  • 三是如果用戶沒配置 handler,則會進入到內核默認行為中。

由于我們的服務程序沒對 SIG_PIPE 信號配過任何處理邏輯,所以 get_signal 在遇到 SIG_PIPE 時會進入到第三步 -- 內核默認行為處理。

我們來繼續看看,內核的默認行為究竟是啥樣的。

//file:kernel/signal.c
bool get_signal(struct ksignal *ksig)
{
 ...
 for (;;) {
  // 1.取出信號
  ......

  // 2.判斷信號是否配置了 handler
  ......

  // 3.接下來就是內核的默認行為了
  // 3.1 如果是可以忽略的信號,直接跳過
  if (sig_kernel_ignore(signr)) /* Default is nothing. */
   continue;

  // 3.2 判斷是否是暫停執行信號,是則暫停其運行
  if (sig_kernel_stop(signr)) {
   do_signal_stop(ksig->info.si_signo)
  }

  fatal:
  // 3.3 判斷是否需要 coredump
  //     coredump 會殺死進程下的所有線程,并生成 coredump 文件
  if (sig_kernel_coredump(signr)) {
   do_coredump(&ksig->info);
  }

  // 3.4 對于非以上情形的信號
  //     直接讓進程下所有線程退出,并且不生成coredump
  do_group_exit(ksig->info.si_signo);
 }
 ......
}

內核默認行為大概是分成四種。

第一種是默認要忽略的信號。從內核源碼里可以看到 SIGCONT、SIGCHLD、SIGWINCH 和 SIGURG,這幾個信號內核都是默認忽略的。

//file: include/linux/signal.h
#define sig_kernel_ignore(sig)  siginmask(sig, SIG_KERNEL_IGNORE_MASK)
#define SIG_KERNEL_IGNORE_MASK (\
        rt_sigmask(SIGCONT)   |  rt_sigmask(SIGCHLD)   | \
 rt_sigmask(SIGWINCH)  |  rt_sigmask(SIGURG)    )

第二種是暫停信號。內核對 SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU 這幾個信號的默認行為是暫停進程運行。

是的,你沒猜錯。各個 IDE 中集成的代碼斷點調試器就是使用 SIGSTOP 信號來工作的。調試器給被調試進程發送 SIGSTOP 信號,讓其進入停止狀態。等到需要繼續運行的時候,再發送 SIGCONT 信號讓被調試進程繼續運行。

理解了 SIGSTOP 你也就理解調試器的底層工作原理了。調試器通過 SIGSTOP 和 SIGCONT 等信號將被調試進程玩弄于股掌之間!

//file: include/linux/signal.h
#define sig_kernel_stop(sig)  siginmask(sig, SIG_KERNEL_STOP_MASK)
#define SIG_KERNEL_STOP_MASK (\
 rt_sigmask(SIGSTOP)   |  rt_sigmask(SIGTSTP)   | \
 rt_sigmask(SIGTTIN)   |  rt_sigmask(SIGTTOU)   )

第三種是需要終止程序運行,并生成 coredump 文件的信號。通過源碼我們可以看到 SIGQUIT、SIGILL、SIGTRAP、SIGABRT、SIGABRT、SIGFPE、SIGSEGV、SIGBUS、SIGSYS、SIGXCPU、SIGXFSZ 這些信號的默認行為走這個邏輯。

我們以 SIGSEGV 為例,當應用程序試圖訪問空指針、數組越界訪問等無效的內存操作時,內核會給當前進程發送 SIGSEGV 信號。

內核對于這些信號的默認行為就是會調用 do_coredump 內核函數。這個函數會殺死目標程序所有線程的運行,并生成 coredump 文件。

我們線上遇到的絕大部分程序崩潰都是這一類。

//file: include/linux/signal.h
#define sig_kernel_coredump(sig) siginmask(sig, SIG_KERNEL_COREDUMP_MASK)
#define SIG_KERNEL_COREDUMP_MASK (\
        rt_sigmask(SIGQUIT)   |  rt_sigmask(SIGILL)    | \
 rt_sigmask(SIGTRAP)   |  rt_sigmask(SIGABRT)   | \
        rt_sigmask(SIGFPE)    |  rt_sigmask(SIGSEGV)   | \
 rt_sigmask(SIGBUS)    |  rt_sigmask(SIGSYS)    | \
        rt_sigmask(SIGXCPU)   |  rt_sigmask(SIGXFSZ)   | \
 SIGEMT_MASK           )

但是看了這么多信號名了,還是找不到我們開篇提到的 SIGPIPE,好氣?。?!

最后仔細看完代碼以后,發現對于非上面提到的信號外,對于其它的所有信號包括 SIGPIPE 的默認行為都是調用 do_group_exit。這個內核函數的行為也是殺死進程下的所有線程,但不生成 coredump 文件?。?!

三、應用層如何應對 SIGPIPE

看完前面兩節,我們徹底弄明白了為什么我們的應用程序會崩潰了。

事故大體邏輯是這樣的:

  • 1.服務依賴的程序熱升級的時候有連接異常斷開
  • 2.服務并不知道連接異常,還是正常向連接里發送數據
  • 3.內核在處理數據發送時發現,該連接已經異常中斷了,直接給應用程序發送一個 SIGPIPE 信號
  • 4.服務程序會進入到信號處理流程中
  • 5.由于應用程序未對 SIGPIPE 定義處理邏輯,所以走的是內核默認行為
  • 6.內核對于 SIGPIPE 的默認行為是終止程序運行,但不生成 coredump 文件

弄懂了崩潰發生的原因,解決方法自然就明朗了。只需要在應用程序中定義對 SIGPIPE 的處理邏輯就行了。我在項目中增加了以下簡單的幾行代碼。

// 設置 SIGPIPE 的信號處理器為忽略
let ignore_action = SigAction::new(
 SigHandler::SigIgn, // SigIgn表示忽略信號
 signal::SaFlags::empty(),
  SigSet::empty(),
);

// 注冊信號處理器
unsafe {
 signal::sigaction(Signal::SIGPIPE, &ignore_action)
  .expect("Failed to set SIGPIPE handler to ignore");
}

這樣就不會走到內核在處理 SIGPIPE 信號時,在 get_signal 函數中發現用戶進程設置了 SIGPIPE 信號的行為是 SIG_IGN,則就直接跳過,再也不會把進程殺死了。

//file:kernel/signal.c
bool get_signal(struct ksignal *ksig)
{
 ...
 for (;;) {
  // 1.取出信號
  ...
  // 2.判斷用戶進程是否為信號配置了 handler
  // 2.1 如果是 SIG_IGN(ignore的縮寫),就跳過
  if (ka->sa.sa_handler == SIG_IGN) 
   continue;
  // 3.接下來就是內核的默認行為了
  ...
 }
 ...
}

不少同學可能會好奇,為啥我的進程中從來沒處理過 SIGPIPE 信號,咋就沒遇到過這種詭異的崩潰問題呢?

原因是 Golang 等語言運行時會替我們做好這個設置。但我的開發場景是使用 Golang 作為宿主,又通過 cgo 調用了 Rust 的動態鏈接庫。而 Golang 并沒有針對這種場景做好處理。

Golang 語言運行時的處理行為解釋參見 Go 源碼的 os/signal/doc.go 文件中的注釋。

If the program has not called Notify to receive SIGPIPE signals, then
the behavior depends on the file descriptor number. A write to a
broken pipe on file descriptors 1 or 2 (standard output or standard
error) will cause the program to exit with a SIGPIPE signal. A write
to a broken pipe on some other file descriptor will take no action on
the SIGPIPE signal, and the write will fail with an EPIPE error.

這段注釋清晰地說了 Go 語言運行時對于 SIGPIPE 信號處理

  • 如果 fd 是 stdout、stderr,那么程序收到 SIGPIPE 信號,默認行為是程序會退出;
  • 如果是其他 fd(比如 TCP 連接),程序收到SIGPIPE信號,不采取任何動作,返回一個EPIPE錯誤即可

對于 cgo 場景,Go 的源碼注釋中講了很多,我把其中最關鍵的一句摘出來

If the SIGPIPE is received on a non-Go thread the signal will
be forwarded to the non-Go handler, if any; if there is none the
default system handler will cause the program to terminate.

如果 SIGPIPE 是在非 go 線程上執行,那么就取決于另一個語言運行時有沒有設置 handler 了。如果沒有設置,就會走到內核的默認行為中,導致程序終止。

顯然我遇到的問題就讓注釋中這句話給說完了。

總結

好了,最后我們再總結一下。我們的應用程序會崩潰的原因是這樣的:

  • 服務依賴的程序熱升級的時候有連接異常斷開
  • 服務并不知道連接異常,還是正常向連接里發送數據
  • 內核在處理數據發送時發現,該連接已經異常中斷了,直接給應用程序發送一個 SIGPIPE 信號
  • 服務程序會進入到信號處理流程中
  • 由于應用程序未對 SIGPIPE 定義處理邏輯,所以走的是內核默認行為
  • 內核對于 SIGPIPE 的默認行為是終止程序運行,但不生成 coredump 文件

Golang 為了避免網絡斷連把程序搞崩在語言運行時中,設置了對非 0、1 文件句柄的默認處理行為為忽略。但是對于我使用的 Go 在進程內通過 cgo 訪問 Rust 代碼的情況并沒有很好地處理。

最終導致在 SIGPIPE 信號發生時,進入到了內核的默認處理行為中,服務程序退出且不留 coredump。

線上問題最難的地方在于定位根因,一但根因定位出來了,處理起來就簡單多了。最后我在 Rust 代碼中配置了對 SIGPIPE 的處理行為為 SIGIGN 后問題就徹底搞定了??!

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

2022-03-01 20:33:50

服務web項目

2021-03-01 08:05:09

慢查詢SQL

2022-10-25 17:53:09

Java線程池

2023-03-06 08:59:18

AMD顯卡驅動

2022-08-21 21:39:06

程序員建議

2021-04-29 23:45:07

函數式接口可用性

2020-10-14 10:29:58

人工智能

2021-12-06 07:47:36

Linux 驅動程序Linux 系統

2024-08-27 09:02:21

2016-03-21 09:05:06

2010-07-15 13:54:25

最“搞”服務器

2020-03-12 07:55:50

訪問量飆升DDoS

2024-04-02 08:30:40

RustUnix信號服務器

2025-09-26 01:11:00

AlibabaJManusjava

2013-06-20 11:11:00

程序員經理

2021-03-11 16:45:29

TCP程序C語言

2024-11-19 08:36:16

2024-11-11 14:57:56

JWTSession微服務

2025-03-24 08:00:00

數據庫開發代碼

2020-05-02 15:10:53

AI 王者榮耀人工智能
點贊
收藏

51CTO技術棧公眾號

色欲av伊人久久大香线蕉影院| 波多野结衣有码| 1769在线观看| 国产乱子伦一区二区三区国色天香 | 亚洲女同精品视频| 99re精彩视频| 99热99re6国产在线播放| 2024国产精品| 3d蒂法精品啪啪一区二区免费| 日韩精品久久久久久久| 日韩欧美高清在线播放| 精品对白一区国产伦| 九热视频在线观看| 成人超碰在线| 中文字幕日韩一区| 欧美aaaaa喷水| 亚洲AV无码成人片在线观看| 性欧美xxxx大乳国产app| 久久亚洲精品网站| 四虎国产精品成人免费入口| 视频精品一区| 欧美日韩一区中文字幕| 欧美精品一区二区三区三州| 精品欧美色视频网站在线观看| 91亚洲精品久久久蜜桃网站| 91网站在线免费观看| 国产亚洲欧美在线精品| 欧美成人tv| 日韩一区二区精品视频| 久久久精品人妻无码专区| 麻豆一二三区精品蜜桃| 欧美午夜片在线看| 国产综合免费视频| 在线观看涩涩| 亚洲v日本v欧美v久久精品| 亚洲成人a**址| 韩国中文免费在线视频| 成人av电影在线观看| 亚洲综合中文字幕在线| 一二三四区视频| 日韩欧美亚洲国产| 国产精品久久久久久久久夜色| 第三区美女视频在线| 国产不卡视频在线播放| 国产精品吴梦梦| jizz国产在线观看| 国产精品最新自拍| 久久久之久亚州精品露出| 91九色丨porny丨极品女神| 日韩激情一区| 在线观看日韩专区| 国产熟女一区二区| 精品产国自在拍| 亚洲视频欧美视频| av男人的天堂av| 精品国产一区二区三区| 亚洲天堂一区二区三区| 91网站免费视频| 精品日产免费二区日产免费二区| 国产午夜精品麻豆| 一本加勒比北条麻妃| 免费视频国产一区| 亚洲女人被黑人巨大进入| 国产男女猛烈无遮挡a片漫画| 国产成人高清精品免费5388| 欧美成人三级在线| 800av在线播放| 日韩欧美四区| 亚洲一二在线观看| 久久中文字幕在线| 欧美午夜aaaaaa免费视频| 日韩中文影院| 欧美日韩一级视频| 一级黄色片国产| 精品一区二区三区中文字幕在线| 日韩午夜精品电影| www国产视频| 综合干狼人综合首页| 在线日韩中文字幕| av在线免费播放网址| 欧美精品国产一区| 97精品免费视频| 天天干天天干天天操| 首页亚洲欧美制服丝腿| 国产一区红桃视频| 国产18精品乱码免费看| 久久综合成人精品亚洲另类欧美| 日韩欧美一区二区视频在线播放| 欧美猛烈性xbxbxbxb| 一区二区在线免费观看| 97国产精东麻豆人妻电影| 日韩在线短视频| 日韩欧美一级精品久久| 日韩精品卡通动漫网站| 91精品天堂福利在线观看| 午夜精品视频在线| 一级做a爱片性色毛片| 国产精品自产自拍| 欧洲久久久久久| 麻豆视频在线播放| 色综合久久久久综合| 亚洲一二三不卡| 少妇久久久久| 欧美xxxx做受欧美| 国产亚洲欧美日韩高清| 国产乱子轮精品视频| 欧洲精品国产| 变态调教一区二区三区| 欧美日韩美少妇| 亚洲熟女一区二区| 久久久久午夜电影| 日韩av手机在线观看| www.黄色av| 日本一区二区综合亚洲| 日韩激情视频一区二区| 欧美综合影院| 亚洲美女av电影| 精品无码黑人又粗又大又长| 秋霞午夜鲁丝一区二区老狼| 精品国产aⅴ麻豆| 亚洲va久久久噜噜噜久久天堂| 这里只有精品免费视频| 不卡视频免费播放| 免费看污污视频| 激情久久99| 国产午夜精品麻豆| 91精品国产乱码久久久张津瑜| 国产在线不卡一卡二卡三卡四卡| 清纯唯美一区二区三区| 波多野结衣精品| 日韩欧美中文字幕制服| 欧美性生交大片| 日韩中文字幕区一区有砖一区| 国产福利久久| 新版中文在线官网| 91精品国产综合久久久久| 美国美女黄色片| 日欧美一区二区| 欧美日韩电影一区二区三区| 黄色aa久久| 亚洲大胆人体av| 久久久久亚洲av无码专区| 国产乱淫av一区二区三区| 一区二区三区视频在线播放| 国产一区二区主播在线| 亚洲人在线观看| 日韩欧美在线观看免费| 2020国产精品自拍| 国产亚洲天堂网| 亚洲欧美日本伦理| 欧洲日韩成人av| 欧洲一级在线观看| 色老汉av一区二区三区| 日韩人妻无码精品综合区| 性xx色xx综合久久久xx| 日韩.欧美.亚洲| 日本少妇一区| 色妞久久福利网| 在线观看中文字幕2021| 国产精品国产自产拍高清av王其| 日本中文字幕高清| 久久亚洲影视| 91网站在线免费观看| 国产淫片在线观看| 欧美成人一区二区| 黄色片视频网站| 久久新电视剧免费观看| 日韩一级片播放| 久久精品欧美一区| 国产66精品久久久久999小说| 调教一区二区| 亚洲国模精品私拍| 无码人妻久久一区二区三区| 国产精品久久夜| 无套白嫩进入乌克兰美女| 136国产福利精品导航网址| 国产伦理一区二区三区| 欧美大胆性生话| 中文字幕亚洲一区| 精品免费久久久| 偷窥国产亚洲免费视频| 手机毛片在线观看| 国产福利精品一区二区| 免费国产a级片| 欧美丝袜激情| 91青青草免费在线看| 福利在线免费视频| 色小说视频一区| 精品国产黄色片| 欧美天堂在线观看| 国精产品久拍自产在线网站| 成人小视频在线观看| 十八禁视频网站在线观看| 亚洲色图插插| 美脚丝袜一区二区三区在线观看| 四虎地址8848精品| 国内成人精品视频| 日韩av中文| 亚洲精品成人久久| 国产一区二区自拍视频| 亚洲超碰精品一区二区| 国产在视频线精品视频| 成人综合婷婷国产精品久久| 99视频在线视频| 激情成人亚洲| 在线观看日本一区| 婷婷亚洲精品| 成人黄视频免费| 久久av影院| 91po在线观看91精品国产性色| 午夜免费播放观看在线视频| 亚洲精品97久久| 国产精品无码在线播放 | 亚洲国产私拍精品国模在线观看| 美女黄页在线观看| 精品福利一区二区| 婷婷在线精品视频| 国产精品成人免费精品自在线观看| a级片在线观看视频| 精品一区二区三区的国产在线播放 | 亚洲图片欧美色图| 91狠狠综合久久久久久| 26uuu另类欧美亚洲曰本| 女人扒开双腿让男人捅| 麻豆精品一区二区综合av| 青青青在线播放| 在线观看日韩av电影| 日韩中文在线字幕| 日韩欧美高清在线播放| 四虎影院一区二区三区| 一区二区三区四区在线看| 国产日韩欧美综合精品| 999久久精品| 91久久精品www人人做人人爽| 国产欧美自拍| 国产精品欧美日韩一区二区| 亚洲日本天堂| 久久久久久一区二区三区| www视频在线免费观看| 日韩中文字幕免费看| 性开放的欧美大片| 最新91在线视频| 91精彩视频在线播放| 国产午夜精品一区理论片飘花| 秋霞av在线| 亚洲美女av电影| 国产中文字幕在线看| 亚洲人成电影在线播放| 蜜桃视频在线免费| 国产午夜精品免费一区二区三区 | 亚洲精品二区| 日韩av密桃| 亚洲精品久久区二区三区蜜桃臀| 日本一区二区高清不卡| 亚洲一区二区三区加勒比| 久久久久国产| 国产成人一二三区| 伊人激情综合| 美女日批免费视频| 午夜一区在线| 成人精品视频一区二区| 美女网站在线免费欧美精品| 天天色综合天天色| 国产一区二区三区av电影| 成人免费黄色av| 国产91精品一区二区麻豆网站 | 免费看日产一区二区三区| 91嫩草免费看| 欧美三级午夜理伦三级小说| 免费试看一区| 三区四区不卡| 黄色一级大片免费| 国产精品五区| 91香蕉视频导航| 国产精品18久久久久久久网站| 日本中文字幕精品| 91免费视频网| 毛片久久久久久| 一区二区三区四区亚洲| 在线观看精品国产| 欧美三级中文字| 国产白浆在线观看| 日韩经典第一页| 1pondo在线播放免费| 欧美国产高跟鞋裸体秀xxxhd| 国产激情视频在线看| 国产精品久久久av| 国产一区一区| 麻豆传媒一区| 亚洲国产一成人久久精品| 免费看国产曰批40分钟| 免费人成黄页网站在线一区二区| 小日子的在线观看免费第8集| 91香蕉视频mp4| 国产精品久久久久久成人| 亚洲自拍偷拍九九九| 日韩精品一区不卡| 日韩一区二区三区电影| 久青青在线观看视频国产| 欧美另类在线观看| 深夜视频一区二区| 国产高清精品一区二区| 成人激情诱惑| 黄色片网址在线观看| 麻豆成人久久精品二区三区小说| 稀缺小u女呦精品呦| 国产精品久久久爽爽爽麻豆色哟哟| 国产一级特黄aaa大片| 884aa四虎影成人精品一区| 头脑特工队2免费完整版在线观看 头脑特工队2在线播放 | 中文字幕欧美一| 国产小视频在线免费观看| 91精品欧美一区二区三区综合在| 日本一级在线观看| 色综合91久久精品中文字幕 | 黄色av电影网站| 26uuu亚洲婷婷狠狠天堂| 一起操在线播放| 色偷偷88欧美精品久久久| 成人av免费播放| 日韩有码在线电影| 色老太综合网| 九九热久久66| 国内精品久久久久久久影视麻豆| 黄色aaa级片| 久久欧美一区二区| 91精品国产乱码久久久张津瑜 | 日本亚洲欧美成人| 久久夜色电影| 国产成人一区二区三区别| 久久99精品国产91久久来源| 欧美特级黄色录像| 色一区在线观看| 日本黄在线观看| 午夜精品久久17c| 国产一区二区在线视频你懂的| 国产一二三四区在线观看| 麻豆91在线播放| 国产精品www爽爽爽| 91久久一区二区| 国产毛片av在线| 国产成人在线视频| 亚洲国产国产| 一本久道综合色婷婷五月| 久久看人人爽人人| 加勒比在线一区| 亚洲色图第一页| 春暖花开亚洲一区二区三区| 欧美一级二级三级| 日韩专区中文字幕一区二区| 丰满少妇一区二区| 色悠久久久久综合欧美99| 国产视频网址在线| 国产精品一区久久| 久久理论电影| 九一精品久久久| 亚洲伦在线观看| 亚洲成人一级片| 97精品在线视频| 偷窥自拍亚洲色图精选| 亚洲精品无码久久久久久| 国产三级久久久| 中文字幕免费播放| xxxx欧美18另类的高清| 成人豆花视频| a天堂资源在线观看| 99久久免费精品高清特色大片| 影音先锋亚洲天堂| 亚洲一区二区黄| 精品一区二区三区在线观看视频 | 在线中文字幕-区二区三区四区| http;//www.99re视频| 国产精品大片免费观看| 亚洲一区二区乱码| 在线精品视频免费播放| 日本不卡不卡| 国产精品乱码视频| 狂野欧美性猛交xxxx巴西| 美女av免费看| 日韩欧美卡一卡二| 深夜在线视频| 日韩久久久久久久| 国产裸体歌舞团一区二区| 日韩大片免费在线观看| 亚洲欧美在线磁力| 国产日本亚洲| www.av中文字幕| 国产精品传媒入口麻豆| 亚洲精品国产av| 日本不卡视频在线播放| 天天做天天爱天天综合网| 婷婷五月精品中文字幕| 欧美在线制服丝袜| 国内在线视频| 丝袜足脚交91精品| 成人av免费在线| 国产又大又黄的视频| 69视频在线免费观看| 66国产精品| 97伦伦午夜电影理伦片|