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

你不知道的Node.js性能優化,讀了之后水平直線上升!

開發 前端
本文作者總結了Node.js性能優化方法,其中包括使用最新版本、使用 fast-json-stringify 加速 JSON 序列化、提升 Promise 的性能等等。

1、使用最新版本的 Node.js

僅僅是簡單的升級 Node.js 版本就可以輕松地獲得性能提升,因為幾乎任何新版本的 Node.js 都會比老版本性能更好,為什么?

Node.js 每個版本的性能提升主要來自于兩個方面:

  • V8 的版本更新;
  • Node.js 內部代碼的更新優化。

例如最新的 V8 7.1 中,就優化了某些情形下閉包的逃逸分析,讓 Array 的一些方法得到了性能提升:

 

 

 

你不知道的Node.js性能優化,讀了之后水平直線上升

 

Node.js 的內部代碼,隨著版本的升級,也會有明顯的優化,比如下面這個圖就是 require 的性能隨著 Node.js 版本升級的變化:

 

 

 

你不知道的Node.js性能優化,讀了之后水平直線上升

 

每個提交到 Node.js 的 PR 都會在 review 的時候考慮會不會對當前性能造成衰退。同時也有專門的 benchmarking 團隊來監控性能變化,你可以在這里看到 Node.js 的每個版本的性能變化:

https://benchmarking.nodejs.org/

所以,你可以完全對新版本 Node.js 的性能放心,如果發現了任何在新版本下的性能衰退,歡迎提交一個 issue。

如何選擇 Node.js 的版本?

這里就要科普一下 Node.js 的版本策略:

  • Node.js 的版本主要分為 Current 和 LTS;
  • Current 就是當前最新的、依然處于開發中的 Node.js 版本;
  • LTS 就是穩定的、會長期維護的版本;
  • Node.js 每六個月(每年的四月和十月)會發布一次大版本升級,大版本會帶來一些不兼容的升級;
  • 每年四月發布的版本(版本號為偶數,如 v10)是 LTS 版本,即長期支持的版本,社區會從發布當年的十月開始,繼續維護 18 + 12 個月(Active LTS + Maintaince LTS);
  • 每年十月發布的版本(版本號為奇數,例如現在的 v11)只有 8 個月的維護期。

舉個例子,現在(2018年11月),Node.js Current 的版本是 v11,LTS 版本是 v10 和 v8。更老的 v6 處于 Maintenace LTS,從明年四月起就不再維護了。去年十月發布的 v9 版本在今年六月結束了維護。

 

 

 

 

對于生產環境而言,Node.js 官方推薦使用最新的 LTS 版本,現在是 v10.13.0。

2、使用 fast-json-stringify 加速 JSON 序列化

在 JavaScript 中,生成 JSON 字符串是非常方便的: 

  1. const json = JSON.stringify(obj) 

但很少人會想到這里竟然也存在性能優化的空間,那就是使用 JSON Schema 來加速序列化。

在 JSON 序列化時,我們需要識別大量的字段類型,比如對于 string 類型,我們就需要在兩邊加上 ",對于數組類型,我們需要遍歷數組,把每個對象序列化后,用 , 隔開,然后在兩邊加上 [ 和 ],諸如此類等等。

但如果已經提前通過 Schema 知道每個字段的類型,那么就不需要遍歷、識別字段類型,而可以直接用序列化對應的字段,這就大大減少了計算開銷,這就是 fast-json-stringfy 的原理。

根據項目中的跑分,在某些情況下甚至可以比 JSON.stringify 快接近 10 倍!

 

 

 

 

一個簡單的示例: 

  1. const fastJson = require('fast-json-stringify'
  2. const stringify = fastJson({ 
  3.     title: 'Example Schema'
  4.     type: 'object'
  5.     properties: { 
  6.         name: { type: 'string' }, 
  7.         age: { type: 'integer' }, 
  8.         books: { 
  9.             type: 'array'
  10.             items: { 
  11.                 type: 'string'
  12.                 uniqueItems: true 
  13.             } 
  14.         } 
  15.     } 
  16. }) 
  17.  
  18. console.log(stringify({ 
  19.     name'Starkwang'
  20.     age: 23, 
  21.     books: ['C++ Primier''響け!ユーフォニアム~'
  22. })) 
  23. //=> {"name":"Starkwang","age":23,"books":["C++ Primier","響け!ユーフォニアム~"]}  

在 Node.js 的中間件業務中,通常會有很多數據使用 JSON 進行,并且這些 JSON 的結構是非常相似的(如果你使用了 TypeScript,更是這樣),這種場景就非常適合使用 JSON Schema 來優化。

3、提升 Promise 的性能

Promise 是解決回調嵌套地獄的靈丹妙藥,特別是當自從 async/await 全面普及之后,它們的組合無疑成為了 JavaScript 異步編程的終極解決方案,現在大量的項目都已經開始使用這種模式。

但是優雅的語法后面也隱藏著性能損耗,我們可以使用 github 上一個已有的跑分項目進行測試,以下是測試結果: 

  1. file                               time(ms)  memory(MB) 
  2. callbacks-baseline.js                   380       70.83 
  3. promises-bluebird.js                    554       97.23 
  4. promises-bluebird-generator.js          585       97.05 
  5. async-bluebird.js                       593      105.43 
  6. promises-es2015-util.promisify.js      1203      219.04 
  7. promises-es2015-native.js              1257      227.03 
  8. async-es2017-native.js                 1312      231.08 
  9. async-es2017-util.promisify.js         1550      228.74 
  10.  
  11. Platform info: 
  12. Darwin 18.0.0 x64 
  13. Node.JS 11.1.0 
  14. V8 7.0.276.32-node.7 
  15. Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz × 4  

我們可以從結果中看到,原生 async/await + Promise 的性能比 callback 要差很多,并且內存占用也高得多。對于大量異步邏輯的中間件項目而言,這里的性能開銷還是不能忽視的。

通過對比可以發現,性能損耗主要來自于 Promise 對象自身的實現,V8 原生實現的 Promise 比 bluebird 這樣第三方實現的 Promise 庫要慢很多。而 async/await 語法并不會帶來太多的性能損失。

所以對于大量異步邏輯、輕量計算的中間件項目而言,可以在代碼中把全局的 Promise 換為 bluebird 的實現: 

  1. global.Promise = require('bluebird'); 

4、正確地編寫異步代碼

使用 async/await 之后,項目的異步代碼會非常好看: 

  1. const foo = await doSomethingAsync(); 
  2. const bar = await doSomethingElseAsync();  

但因此,有時我們也會忘記使用 Promise 給我們帶來的其它能力,比如 Promise.all() 的并行能力: 

  1. // bad 
  2. async function getUserInfo(id) { 
  3.     const profile = await getUserProfile(id); 
  4.     const repo = await getUserRepo(id) 
  5.     return { profile, repo } 
  6.  
  7. // good 
  8. async function getUserInfo(id) { 
  9.     const [profile, repo] = await Promise.all([ 
  10.         getUserProfile(id), 
  11.         getUserRepo(id) 
  12.     ]) 
  13.     return { profile, repo } 
  14.  

還有比如 Promise.any()(此方法不在ES6 Promise標準中,也可以使用標準的 Promise.race() 代替),我們可以用它輕松實現更加可靠快速的調用: 

  1. async function getServiceIP(name) { 
  2.     // 從 DNS 和 ZooKeeper 獲取服務 IP,哪個先成功返回用哪個 
  3.     // 與 Promise.race 不同的是,這里只有當兩個調用都 reject 時,才會拋出錯誤 
  4.     return await Promise.any([ 
  5.         getIPFromDNS(name), 
  6.         getIPFromZooKeeper(name
  7.     ]) 
  8. }   

5、優化 V8 GC

關于 V8 的垃圾回收機制,已經有很多類似的文章了,這里就不再重復介紹。推薦兩篇文章:

  • 解讀 V8 GC Log(一): Node.js 應用背景與 GC 基礎知識
  • 解讀 V8 GC Log(二): 堆內外內存的劃分與 GC 算法

我們在日常開發代碼的時候,比較容易踩到下面幾個坑:

坑一:使用大對象作為緩存,導致老生代(Old Space)的垃圾回收變慢

示例: 

  1. const cache = {} 
  2. async function getUserInfo(id) { 
  3.     if (!cache[id]) { 
  4.         cache[id] = await getUserInfoFromDatabase(id) 
  5.     } 
  6.     return cache[id] 
  7.  

這里我們使用了一個變量 cache 作為緩存,加速用戶信息的查詢,進行了很多次查詢后,cache 對象會進入老生代,并且會變得無比龐大,而老生代是使用三色標記 + DFS 的方式進行 GC 的,一個大對象會直接導致 GC 花費的時間增長(而且也有內存泄漏的風險)。

解決方法就是:

  • 使用 Redis 這樣的外部緩存,實際上像 Redis 這樣的內存型數據庫非常適合這種場景;
  • 限制本地緩存對象的大小,比如使用 FIFO、TTL 之類的機制來清理對象中的緩存。

坑二:新生代空間不足,導致頻繁 GC

這個坑會比較隱蔽。

Node.js 默認給新生代分配的內存是 64MB(64位的機器,后同),但因為新生代 GC 使用的是 Scavenge 算法,所以實際能使用的內存只有一半,即 32MB。

當業務代碼頻繁地產生大量的小對象時,這個空間很容易就會被占滿,從而觸發 GC。雖然新生代的 GC 比老生代要快得多,但頻繁的 GC 依然會很大地影響性能。極端的情況下,GC 甚至可以占用全部計算時間的 30% 左右。

解決方法就是,在啟動 Node.js 時,修改新生代的內存上限,減少 GC 的次數: 

  1. node --max-semi-space-size=128 app.js 

當然有人肯定會問,新生代的內存是不是越大越好呢?

隨著內存的增大,GC 的次數減少,但每次 GC 所需要的時間也會增加,所以并不是越大越好,具體數值需要對業務進行壓測 profile 才能確定分配多少新生代內存最好。

但一般根據經驗而言,分配 64MB 或者 128MB 是比較合理的。

6、正確地使用 Stream

Stream 是 Node.js 最基本的概念之一,Node.js 內部的大部分與 IO 相關的模塊,比如 http、net、fs、repl,都是建立在各種 Stream 之上的。

下面這個經典的例子應該大部分人都知道,對于大文件,我們不需要把它完全讀入內存,而是使用 Stream 流式地把它發送出去: 

  1. const http = require('http'); 
  2. const fs = require('fs'); 
  3.  
  4. // bad 
  5. http.createServer(function (req, res) { 
  6.     fs.readFile(__dirname + '/data.txt'function (err, data) { 
  7.         res.end(data); 
  8.     }); 
  9. }); 
  10.  
  11. // good 
  12. http.createServer(function (req, res) { 
  13.     const stream = fs.createReadStream(__dirname + '/data.txt'); 
  14.     stream.pipe(res); 
  15. });  

在業務代碼中合理地使用 Stream 能很大程度地提升性能,當然是但實際的業務中我們很可能會忽略這一點,比如采用 React 服務器端渲染的項目,我們就可以用 renderToNodeStream: 

  1. const ReactDOMServer require('react-dom/server'
  2. const http = require('http'
  3. const fs = require('fs'
  4. const app = require('./app'
  5.  
  6. // bad 
  7. const server = http.createServer((req, res) => { 
  8.     const body = ReactDOMServer.renderToString(app) 
  9.     res.end(body) 
  10. }); 
  11.  
  12. // good 
  13. const server = http.createServer(function (req, res) { 
  14.     const stream = ReactDOMServer.renderToNodeStream(app) 
  15.     stream.pipe(res) 
  16. }) 
  17.  
  18. server.listen(8000)  

使用 pipeline 管理 stream

在過去的 Node.js 中,處理 stream 是非常麻煩的,舉個例子: 

  1. source.pipe(a).pipe(b).pipe(c).pipe(dest) 

一旦其中 source、a、b、c、dest 中,有任何一個 stream 出錯或者關閉,會導致整個管道停止,此時我們需要手工銷毀所有的 stream,在代碼層面這是非常麻煩的。

所以社區出現了 pump 這樣的庫來自動控制 stream 的銷毀。而 Node.js v10.0 加入了一個新的特性:stream.pipeline,可以替代 pump 幫助我們更好的管理 stream。

一個官方的例子: 

  1. const { pipeline } = require('stream'); 
  2. const fs = require('fs'); 
  3. const zlib = require('zlib'); 
  4.  
  5. pipeline( 
  6.     fs.createReadStream('archive.tar'), 
  7.     zlib.createGzip(), 
  8.     fs.createWriteStream('archive.tar.gz'), 
  9.     (err) => { 
  10.         if (err) { 
  11.             console.error('Pipeline failed', err); 
  12.         } else { 
  13.             console.log('Pipeline succeeded'); 
  14.         } 
  15.     } 
  16. );  

實現自己的高性能 Stream

在業務中你可能也會自己實現一個 Stream,可讀、可寫、或者雙向流,可以參考文檔:

  • implementing Readable streams
  • implementing Writable streams

Stream 雖然很神奇,但自己實現 Stream 也可能會存在隱藏的性能問題,比如: 

  1. class MyReadable extends Readable { 
  2.     _read(size) { 
  3.         while (null !== (chunk = getNextChunk())) { 
  4.             this.push(chunk); 
  5.         } 
  6.     } 
  7.  

當我們調用 new MyReadable().pipe(xxx) 時,會把 getNextChunk() 所得到的 chunk 都 push 出去,直到讀取結束。但如果此時管道的下一步處理速度較慢,就會導致數據堆積在內存中,導致內存占用變大,GC 速度降低。

而正確的做法應該是,根據 this.push() 返回值選擇正確的行為,當返回值為 false 時,說明此時堆積的 chunk 已經滿了,應該停止讀入。 

  1. class MyReadable extends Readable { 
  2.     _read(size) { 
  3.         while (null !== (chunk = getNextChunk())) { 
  4.             if (!this.push(chunk)) { 
  5.                 return false   
  6.             } 
  7.         } 
  8.     } 
  9.  

這個問題在 Node.js 官方的一篇文章中有詳細的介紹:Backpressuring in Streams

7、C++ 擴展一定比 JavaScript 快嗎?

Node.js 非常適合 IO 密集型的應用,而對于計算密集的業務,很多人都會想到用編寫 C++ Addon 的方式來優化性能。但實際上 C++ 擴展并不是靈丹妙藥,V8 的性能也沒有想象的那么差。

比如,我在今年九月份的時候把 Node.js 的 net.isIPv6() 從 C++ 遷移到了 JS 的實現,讓大多數的測試用例都獲得了 10%- 250% 不等的性能提升(具體PR可以看這里)。

JavaScript 在 V8 上跑得比 C++ 擴展還快,這種情況多半發生在與字符串、正則表達式相關的場景,因為 V8 內部使用的正則表達式引擎是 irregexp,這個正則表達式引擎比 boost 中自帶的引擎(boost::regex)要快得多。

還有一處值得注意的就是,Node.js 的 C++ 擴展在進行類型轉換的時候,可能會消耗非常多的性能,如果不注意 C++ 代碼的細節,性能會很大地下降。

這里有一篇文章對比了相同算法下 C++ 和 JS 的性能(需翻墻):How to get a performance boost using Node.js native addons。其中值得注意的結論就是,C++ 代碼在對參數中的字符串進行轉換后(String::Utf8Value轉為std::string),性能甚至不如 JS 實現的一半。只有在使用 NAN 提供的類型封裝后,才獲得了比 JS 更高的性能。 

 

 

 

換句話說,C++ 是否比 JavaScript 更加高效需要具體問題具體分析,某些情況下,C++ 擴展不一定就會比原生 JavaScript 更高效。如果你對自己的 C++ 水平不是那么有信心,其實還是建議用 JavaScript 來實現,因為 V8 的性能比你想象的要好得多。

8、使用 node-clinic 快速定位性能問題

說了這么多,有沒有什么可以開箱即用,五分鐘見效的呢?當然有。

node-clinic 是 NearForm 開源的一款 Node.js 性能診斷工具,可以非常快速地定位性能問題。 

  1. npm i -g clinic  
  2. npm i -g autocannon  

使用的時候,先開啟服務進程: 

  1. clinic doctor -- node server.js 

然后我們可以用任何壓測工具跑一次壓測,比如使用同一個作者的 autocannon(當然你也可以使用 ab、curl 這樣的工具來進行壓測。): 

  1. autocannon http://localhost:3000 

壓測完畢后,我們 ctrl + c 關閉 clinic 開啟的進程,就會自動生成報告。比如下面就是我們一個中間件服務的性能報告: 

 

 

 

我們可以從 CPU 的使用曲線看出,這個中間件服務的性能瓶頸不在自身內部的計算,而在于 I/O 速度太慢。clinic 也在上面告訴我們檢測到了潛在的 I/O 問題。

下面我們使用 clinic bubbleprof 來檢測 I/O 問題: 

  1. clinic bubbleprof -- node server.js 

再次進行壓測后,我們得到了新的報告: 

 

 

 

這個報告中,我們可以看到,http.Server 在整個程序運行期間,96% 的時間都處于 pending 狀態,點開后,我們會發現調用棧中存在大量的 empty frame,也就是說,由于網絡 I/O 的限制,CPU 存在大量的空轉,這在中間件業務中非常常見,也為我們指明了優化方向不在服務內部,而在服務器的網關和依賴的服務相應速度上。

想知道如何讀懂 clinic bubbleprof 生成的報告,可以看這里:https://clinicjs.org/bubblepr...

同樣,clinic 也可以檢測到服務內部的計算性能問題,下面我們做一些“破壞”,讓這個服務的性能瓶頸出現在 CPU 計算上。

我們在某個中間件中加入了空轉一億次這樣非常消耗 CPU 的“破壞性”代碼: 

  1. function sleep() { 
  2.     let n = 0 
  3.     while (n++ < 10e7) { 
  4.         empty() 
  5.     } 
  6. function empty() { } 
  7.  
  8. module.exports = (ctx, next) => { 
  9.     sleep() 
  10.     // ...... 
  11.     return next() 
  12.  

然后使用 clinic doctor,重復上面的步驟,生成性能報告: 

 

 

 

這就是一個非常典型的同步計算阻塞了異步隊列的“病例”,即主線程上進行了大量的計算,導致 JavaScript 的異步回調沒法及時觸發,Event Loop 的延遲極高。

對于這樣的應用,我們可以繼續使用 clinic flame 來確定到底是哪里出現了密集計算: 

  1. clinic flame -- node app.js 

壓測后,我們得到了火焰圖(這里把空轉次數減少到了100萬次,讓火焰圖看起來不至于那么極端): 

 

 

 

從這張圖里,我們可以明顯看到頂部的那個大白條,它代表了 sleep 函數空轉所消耗的 CPU 時間。根據這樣的火焰圖,我們可以非常輕松地看出 CPU 資源的消耗情況,從而定位代碼中哪里有密集的計算,找到性能瓶頸。 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-11-16 08:51:29

Node JavaScript變量類型

2021-12-29 11:38:59

JS前端沙箱

2022-09-15 08:33:11

ChaosBladeJava場景

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-09-04 15:54:10

Node.jsAPI技巧

2020-07-03 14:30:34

Node內存前端

2024-02-05 11:55:41

Next.js開發URL

2010-08-23 09:56:09

Java性能監控

2009-12-10 09:37:43

2011-09-15 17:10:41

2021-02-01 23:23:39

FiddlerCharlesWeb

2022-10-13 11:48:37

Web共享機制操作系統

2011-12-09 11:16:48

Node.js

2025-08-13 06:06:39

Node.jsAPMWorker

2020-12-14 07:51:16

JS 技巧虛值

2021-10-17 13:10:56

函數TypeScript泛型

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2015-06-19 13:54:49

2012-11-23 10:57:44

Shell
點贊
收藏

51CTO技術棧公眾號

亚洲欧洲精品一区| 久久激情视频免费观看| 国产av无码专区亚洲精品| 91精品国产91久久久久游泳池| 久久99国产精品免费| 久久久之久亚州精品露出| 久久久久亚洲av无码专区桃色| 亚洲国产天堂| 欧美性色xo影院| 91免费视频黄| 青青国产在线| 成人听书哪个软件好| 国产精品一区专区欧美日韩| 男女视频免费看| 2023国产精品久久久精品双| 亚洲午夜未满十八勿入免费观看全集| 精品国产一区久久| 久久精品aaaaaa毛片| 96日本xxxxxⅹxxx17| 免费永久网站黄欧美| 欧美大秀在线观看| 视频国产一区二区| 国产亚洲一区二区三区啪| 精品国产乱码久久久久久浪潮 | 女厕盗摄一区二区三区| 日韩毛片高清在线播放| 日韩.欧美.亚洲| 亚洲 国产 欧美 日韩| 国产另类ts人妖一区二区| 日韩av免费网站| 国产特黄大片aaaa毛片| 在线欧美不卡| 欧美黄色小视频| 午夜精品一区二区三级视频| 欧美一二区在线观看| 日韩精品在线免费观看视频| 香蕉视频污视频| 综合激情久久| 日韩精品一区二区三区四区| 免费国偷自产拍精品视频| www.久久爱.com| 欧美美女一区二区| 丰满少妇在线观看| 色婷婷综合久久久中字幕精品久久| 岛国av在线不卡| 久久久久久久午夜| 中文在线免费视频| 精品久久久久久国产91| 成人在线国产视频| 97人人在线视频| 亚洲一区二区在线免费看| 欧美一二三不卡| 黄网在线免费看| 亚洲午夜一二三区视频| 日本福利视频一区| 极品在线视频| 日韩欧美中文第一页| 狠狠操精品视频| 国产精品亚洲d| 欧美日韩高清一区二区三区| av中文字幕网址| 国产一区二区三区免费在线 | 色综合久久网女同蕾丝边| 久久综合999| 色姑娘综合网| 美女隐私在线观看| 一级做a爱片久久| 无码中文字幕色专区| xxxxxx欧美| 欧美亚洲尤物久久| 国产精品中文久久久久久| 一区二区三区在线免费看| 日韩av中文在线| av电影网站在线观看| 93在线视频精品免费观看| 欧美激情免费在线| 国产精品一区二区6| 日韩av高清在线观看| 91精品免费久久久久久久久| xxxx18国产| 91香蕉视频mp4| 亚洲在线色站| 成人高潮aa毛片免费| 日本精品视频一区二区三区| 亚洲欧美日韩精品一区| swag国产精品一区二区| 国产一区二区三区视频| 亚洲欧美精品aaaaaa片| 亚洲影院在线| 成人网欧美在线视频| 香蕉久久一区二区三区| 国产精品成人免费在线| 人妻少妇精品无码专区二区 | 欧美日韩国产乱码电影| 国产人妖在线观看| 欧美日韩在线二区| 欧美激情亚洲精品| 91九色蝌蚪91por成人| 成人av电影在线| 在线观看成人av电影| 国产欧洲在线| 91精品蜜臀在线一区尤物| 中文字幕5566| 欧美日韩精选| 国产精品一区=区| 天天插天天干天天操| 日韩一区日韩二区| 久久婷婷国产91天堂综合精品| 亚洲经典视频| 久久精品成人欧美大片| 影音先锋在线国产| 成人免费黄色大片| 熟女熟妇伦久久影院毛片一区二区| 人狥杂交一区欧美二区| 日韩免费视频一区二区| 懂色av粉嫩av浪潮av| 亚洲制服av| 国产自产在线视频一区| 菠萝菠萝蜜在线视频免费观看| 欧美在线观看视频一区二区| 800av在线播放| 欧美视频四区| 亚洲综合日韩在线| 欧美日本一道| 欧美三级乱人伦电影| 最近中文字幕免费视频| 影音先锋久久| 国产精品高清一区二区三区| 9191在线播放| 日韩视频一区在线观看| 国产高清视频免费在线观看| 日本欧美一区二区| 日本一区高清不卡| 亚州一区二区三区| 亚洲欧洲自拍偷拍| 手机av免费观看| 久久精品欧美日韩| 一区二区三区视频在线观看免费| 国产成人精品三级高清久久91| 欧美一级大胆视频| 欧美精品a∨在线观看不卡 | 7777免费精品视频| 色婷婷av一区二区三| 午夜精品一区二区三区免费视频| 乱码一区二区三区| 日韩一区二区久久| 免费成人在线观看av| 久久91导航| 最新亚洲国产精品| 国产乱淫av免费| 亚洲精品美国一| 第一页在线视频| 黄色综合网站| 欧美高清视频一区| 日本黄色一区| 美女精品视频一区| 亚洲va欧美va| 精品久久久久久久久久久久久| 三级电影在线看| 肉肉av福利一精品导航| 亚洲日本精品| 最新国产一区二区| 欧美在线视频观看| av在线之家电影网站| 日韩视频在线你懂得| 精品美女久久久久| 国产精品天美传媒沈樵| 一级黄色大片儿| 亚洲香蕉网站| 日本不卡在线播放| 国产人与zoxxxx另类91| 久久久免费高清电视剧观看| 免费黄色片在线观看| 777xxx欧美| 日本特黄特色aaa大片免费| 久久久久久久久免费| 日本免费色视频| 伊人久久婷婷| 无遮挡亚洲一区| 亚洲精品国产九九九| 热久久这里只有| 成人福利片网站| 精品性高朝久久久久久久| 最近中文字幕在线观看| 夜夜夜精品看看| 美女被到爽高潮视频| 国产伦精一区二区三区| 农村妇女精品一二区| 亚洲精品午夜av福利久久蜜桃| 精品麻豆av| av在线成人| 国产成人极品视频| 国产精品蜜臀| 精品国产一区av| 五月天激情开心网| 91精品国产一区二区三区香蕉| 日本五十路女优| 一色屋精品亚洲香蕉网站| 色呦呦一区二区| 国产资源在线一区| 少妇高清精品毛片在线视频 | 亚洲黄色小说网| 欧美亚男人的天堂| 日本免费观看视| 一区二区三区四区不卡在线 | 欧美777四色影视在线| 777xxx欧美| 中文字幕人妻一区二区三区视频| 亚洲永久精品大片| 国产探花视频在线| 久久久综合激的五月天| 久久性爱视频网站| 国产自产视频一区二区三区| 狠狠躁狠狠躁视频专区| 一区二区自拍| 黄瓜视频免费观看在线观看www| 无码少妇一区二区三区| 国产精品免费在线播放| 日本在线成人| 95av在线视频| 日韩美香港a一级毛片| 国产精品wwww| 国模一区二区| 国产97在线播放| 成人免费网站视频| 欧美中文在线视频| 国产白浆在线免费观看| 午夜精品久久久久久99热| 青草视频在线免费直播| 美日韩丰满少妇在线观看| 黄色视屏免费在线观看| 精品国产一区久久久| 秋霞a级毛片在线看| 伊人一区二区三区久久精品| 极品白浆推特女神在线观看| 亚洲男人天堂网站| 神马久久高清| 亚洲免费视频在线观看| 免费在线看v| 国产亚洲精品久久久优势| 久久天堂电影| 伊人av综合网| 免费观看成人高潮| 久久这里只有精品视频首页| а√资源新版在线天堂| 欧美成人高清视频| 天天干在线视频论坛| 久久久爽爽爽美女图片| 超碰在线公开| 国产成人精品久久久| 国产精品久久久久久妇女| 国产一区深夜福利| 精品国产亚洲日本| 成人欧美一区二区| 女人抽搐喷水高潮国产精品| 免费毛片一区二区三区久久久| 九九热线有精品视频99| 日韩伦理一区二区三区av在线| 欧美gayvideo| 99热这里只有精品免费| 亚洲区欧美区| 国产成人手机视频| 国内精品视频666| 一级全黄裸体片| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲AV无码成人精品区明星换面| 国产精品成人在线观看| 国产真实的和子乱拍在线观看| 欧美日韩在线一区| 中文字幕理论片| 欧美第一区第二区| 青青草av免费在线观看| 色久欧美在线视频观看| 国产蜜臀在线| 国产精品99久久久久久人| 精品国产乱码一区二区三区| 国内一区在线| 亚洲电影在线一区二区三区| 秋霞无码一区二区| 久久99九九99精品| 中国xxxx性xxxx产国| 中文字幕不卡在线播放| 久久免费视频精品| 在线视频欧美区| 亚洲AV无码一区二区三区少妇 | 成人av免费| 欧美一区三区三区高中清蜜桃| 91麻豆精品| 另类欧美小说| 欧美在线日韩| 欧美一级黄色影院| 丁香婷婷综合五月| 日本不卡一二区| 狠狠躁夜夜躁人人爽超碰91| 91福利在线观看视频| 精品视频www| 在线免费av导航| 国产精品第二页| 精品国产一区二区三区不卡蜜臂| 在线观看成人一级片| 久久久久网站| 丰满大乳奶做爰ⅹxx视频| 亚洲色图欧美在线| 成人黄色片在线观看| 亚洲国产精品专区久久| 在线观看av免费| 国产精品影片在线观看| 亚洲人亚洲人色久| 国产高清www| 国产一区二区三区免费在线观看| 日韩乱码人妻无码中文字幕久久| 亚洲午夜视频在线| 国产丰满果冻videossex| 在线观看日韩欧美| 中文在线免费二区三区| 国产精品一区而去| 国产精品啊v在线| 性生活在线视频| 国产精品乱人伦中文| 中文字幕免费高清网站| 亚洲精品日韩丝袜精品| 国产自产自拍视频在线观看| 国产精品国产亚洲精品看不卡15| 亚洲国产精品成人| 五月天激情播播| 中文字幕av一区二区三区高 | 亚洲精品99久久久久中文字幕| av免费在线观| 91亚洲人电影| 97精品在线| 天堂av在线8| 国产精品久久久久婷婷二区次| 最近国语视频在线观看免费播放| 国产一级揄自揄精品视频| 婷婷综合六月| 日本福利一区二区三区| 久久精品系列| 久久亚洲无码视频| 欧美亚洲禁片免费| 午夜在线视频播放| 国产主播精品在线| 亚洲高清影视| 91超薄肉色丝袜交足高跟凉鞋| 夜夜嗨av一区二区三区网页| 丰满肉嫩西川结衣av| 久久久久久亚洲精品| 超碰在线成人| 欧美 日韩 国产一区| 国产日本欧美一区二区| 羞羞色院91蜜桃| 久久亚洲精品一区| 日韩中文字幕视频网| 国内精品在线观看视频| 91亚洲精品一区二区乱码| 性色av免费观看| 综合欧美国产视频二区| 99精品女人在线观看免费视频 | 男人添女人下部高潮视频在线观看| 成人免费视频观看视频| 在线免费高清一区二区三区| 中文字幕狠狠干| 欧美在线高清视频| 国产在线激情视频| 国产欧美日韩一区二区三区| 午夜在线视频一区二区区别| 永久免费毛片在线观看| 欧美一区二区三区视频在线| 99热99re6国产在线播放| 久久涩涩网站| 久久99精品国产.久久久久久 | 欧美在线视频全部完| 欧美三级理伦电影| 国产精品一区二区欧美| 老司机精品视频网站| 国产午夜精品理论片在线| 精品人伦一区二区色婷婷| 浪潮色综合久久天堂| 精品久久免费观看| 99精品国产99久久久久久白柏| 波多野结衣视频观看| 久久97精品久久久久久久不卡| 日韩欧美影院| 午夜免费一级片| 欧美日韩在线视频观看| 免费av网站在线观看| 欧美成人dvd在线视频| 国产在线观看免费一区| 五月婷婷色丁香| 久久天天躁日日躁| 中文字幕伦av一区二区邻居| 久久精品一卡二卡| 日韩欧美精品网址| av网址在线免费观看| 欧美精品在线一区| 国产激情视频一区二区在线观看| 区一区二在线观看| 久久露脸国产精品| 亚洲影视一区| 中文字幕黄色网址| 日韩精品极品毛片系列视频|