Open vSwitch(OVS)使用DPDK

在部署openstack的官方文檔(最近幾個版本)中的neutron組件默認(rèn)使用的是linux bridge來做網(wǎng)橋盆佣,除直接使用提供者網(wǎng)絡(luò)(provider network)以外,網(wǎng)絡(luò)節(jié)點的負載會比較大编饺,所有的外部網(wǎng)絡(luò)通信流量都要走網(wǎng)絡(luò)節(jié)點求豫,于是就看了看Juno版本以后增加的 DVR(分布式虛擬路由器)葫录,有了 DVR 之后剧董,路由變成了分布式,每個計算節(jié)點上面都可以做路由茫负,東西向流量直接通過計算節(jié)點路由而不需要經(jīng)過網(wǎng)絡(luò)節(jié)點蕉鸳,F(xiàn)loating IP 也是在計算節(jié)點上面實現(xiàn)的,對于有 floating IP 的 VM 訪問公網(wǎng)忍法,直接走計算節(jié)點上面的路由器出去潮尝,對于沒有 floating IP 的 VM 訪問公網(wǎng)才會從網(wǎng)絡(luò)節(jié)點的路由器 SNAT 出去。

看來看去饿序,想起來幾年前勉失,我比較熟悉的OVS(Open vSwitch),于是打開官網(wǎng)看了看原探,更新還真不少乱凿,搞出來了個OVN,OVN 是 OVS 的控制平面踢匣,它給 OVS 增加了對虛擬網(wǎng)絡(luò)的原生支持告匠,用在openstack上的話,相當(dāng)于它干了大部分以前neutron agent干的活离唬,計算節(jié)點不在需要部署neutron agent了后专,OVN全搞定,neutron只需要調(diào)用OVN的北向接口输莺,其它的事都交給OVN來搞定戚哎,應(yīng)該說是徹底解放了neutron,具體的安裝配置可以參考:https://docs.openstack.org/networking-ovn/latest/嫂用。

在看OVS文檔過程中型凳,看到了一個DPDK的東東,完全不懂嘱函,于是就研究一下甘畅,在這里把整個過程記錄下來,和大家分享一下。

DPDK

DPDK(Data Plane Development Kit)疏唾,是一組快速處理數(shù)據(jù)包的開發(fā)平臺及接口蓄氧,運行于Intel X86平臺上(最新版本也開始支持PowerPC和ARM)。

在X86結(jié)構(gòu)中槐脏,處理數(shù)據(jù)包的傳統(tǒng)方式是CPU中斷方式喉童,既網(wǎng)卡驅(qū)動接收到數(shù)據(jù)包后通過中斷通知CPU處理,然后由CPU拷貝數(shù)據(jù)并交給協(xié)議棧顿天。在數(shù)據(jù)量大時堂氯,這種方式會產(chǎn)生大量CPU中斷,導(dǎo)致CPU無法運行其他程序牌废。而DPDK則采用輪詢方式實現(xiàn)數(shù)據(jù)包處理過程:DPDK重載了網(wǎng)卡驅(qū)動咽白,該驅(qū)動在收到數(shù)據(jù)包后不中斷通知CPU,而是將數(shù)據(jù)包通過零拷貝技術(shù)存入內(nèi)存畔规,這時應(yīng)用層程序就可以通過DPDK提供的接口局扶,直接從內(nèi)存讀取數(shù)據(jù)包。這種處理方式節(jié)省了CPU中斷時間叁扫、內(nèi)存拷貝時間三妈,并向應(yīng)用層提供了簡單易行且高效的數(shù)據(jù)包處理方式,使得網(wǎng)絡(luò)應(yīng)用的開發(fā)更加方便莫绣。但是DPDK需要網(wǎng)卡支持畴蒲,目前以intel的網(wǎng)卡為主,想要知道您的網(wǎng)卡是否支持对室,可以到DPDK的官網(wǎng)查詢:http://dpdk.org模燥。

怎么樣,是不是很高大尚掩宜?要不要寫個程序通過DPDK提供的接口來讀取數(shù)據(jù)包蔫骂?呵呵,說句實話牺汤,這對我來說目前還有一定難度辽旋,在這里就暫時不給大家show了,如果有興趣的話檐迟,DPDK的源代碼里有helloworld补胚,還有一些其它的sample。

DPDK + OVS

我們再回到OVS上來追迟,OVS是目前得到廣泛認(rèn)可的一個軟件虛擬交換機溶其,目前已經(jīng)實現(xiàn)了通過DPDK的接口從內(nèi)存直接讀取數(shù)據(jù)包,然后在軟件層再進行各種轉(zhuǎn)發(fā)……敦间,這應(yīng)該是充分發(fā)揮了DPDK的優(yōu)勢瓶逃,相信速度也會得到明顯的改善(別高興太早)束铭。下面我就把我在Mac+virtualbox環(huán)境下的整個安裝、調(diào)試過程和大家分享一下厢绝。

基礎(chǔ)環(huán)境準(zhǔn)備

如果您有硬件環(huán)境纯露,那么建議您還是使用兩臺物理服務(wù)器來進行測試,要求是內(nèi)存至少要2G以上代芜,網(wǎng)卡需要支持DPDK,可以到DPDK的官網(wǎng)查詢:http://dpdk.org查詢您的網(wǎng)卡是否支持浓利。
怎么樣知道你的網(wǎng)卡型號呢挤庇? 很簡單,打開機蓋看贷掖,哈哈嫡秕。

當(dāng)然也有不打開機蓋的方法,安裝完操作系統(tǒng)(centos)后苹威,執(zhí)行lspci昆咽,應(yīng)該就能看到你的網(wǎng)卡的具體型號了。

如果沒有硬件怎么辦牙甫? 當(dāng)然是萬能的虛擬機了掷酗,本文中將使用virtualbox來創(chuàng)建兩臺虛擬機進行測試,為了達到相關(guān)的要求窟哺,建議你的機器內(nèi)存>=8G泻轰。

網(wǎng)絡(luò):需要用到3個Host-Only網(wǎng)絡(luò),在virtualbox上提前創(chuàng)建好且轨。


network_3.jpg

網(wǎng)絡(luò)名分別為: vboxnet0浮声、vboxnet1、vboxnet2三個旋奢,它們對應(yīng)的網(wǎng)絡(luò)為:

vboxnet0: 192.168.56.1/24
vboxnet0: 192.168.57.1/24
vboxnet0: 192.168.58.1/24

如下所示:

network_detail.jpg

虛擬機配置:

cpu 2c 內(nèi)存2G 硬盤8G

創(chuàng)建完虛擬機后泳挥,進入網(wǎng)絡(luò)設(shè)置界面:

ifsetting.jpg

網(wǎng)卡1-3設(shè)置相同,分別選擇vboxnet0至朗、vboxnet1屉符、vboxnet2。

特別特別要注意的是:控制芯片一定要選擇82545EM爽丹,混雜模式一定要全部允許

請在看一遍上面的文字筑煮,別怪我沒提醒你。

網(wǎng)卡4主要用于上外網(wǎng)粤蝎,因此選擇"網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)"即可真仲,如下圖所示:

ifnat.jpg

最后“OK”保存,開始安裝你的centos吧初澎,安裝過程中不需要創(chuàng)新新用戶秸应,給root設(shè)置一個密碼虑凛,這些過程就不寫了,如果沒搞過自己琢磨吧软啼。

至此桑谍,假設(shè)你的centos7已經(jīng)安裝完成。

網(wǎng)絡(luò)配置

網(wǎng)卡1用于做管理使用祸挪,配置固定IP锣披,如下:

TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.56.160
NETMASK=255.255.255.0
GATEWAY=192.168.56.1
DEFROUTE=no
NAME=enp0s17
DEVICE=enp0s17
ONBOOT=yes

網(wǎng)卡2和3暫時不用動.

網(wǎng)卡4主要用于上外網(wǎng),配置成自動獲取IP贿条、默認(rèn)路由雹仿、默認(rèn)啟動,如下所示:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s10
UUID=2a07d19e-5811-45c9-abd0-d6134386b4b2
DEVICE=enp0s10
ONBOOT=yes

編譯安裝DPDK

安裝前執(zhí)行下面的命令將操作系統(tǒng)升級到最新版本:

yum update

執(zhí)行下命的命令安裝編譯所需的依賴:

yum install rpm-build autoconf automake libtool systemd-units openssl openssl-devel python2-devel python3-devel python2 python2-twisted python2-zope-interface python2-six python2-sphinx desktop-file-utils groff graphviz procps-ng checkpolicy selinux-policy-devel kernel-devel python-sphinx python-twisted-core python-zope-interface libcap-ng-devel kernel-devel

然后下載當(dāng)前穩(wěn)定版本的源代碼整以,并解壓:

cd /usr/src

wget http://fast.dpdk.org/rel/dpdk-17.05.2.tar.xz

tar xf dpdk-17.05.2.tar.xz

設(shè)置環(huán)境變量胧辽,將以下內(nèi)容增加到~/.bash_profile文件:

export DPDK_DIR=/usr/src/dpdk-stable-17.05.2
export DPDK_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET

執(zhí)行下命的命令進行編譯:

source ~/.bash_profile

cd dpdk-stable-17.05.2

make install T=x86_64-native-linuxapp-gcc

由于DPDK需要將數(shù)據(jù)包從網(wǎng)卡直接拷貝到內(nèi)存,因此需要調(diào)整內(nèi)存頁大小和頁數(shù)公黑,以提高內(nèi)存使用效率邑商。

編輯/etc/default/grub文件,將下面的內(nèi)容加到引導(dǎo)啟動項GRUB_CMDLINE_LINUX:

default_hugepagesz=2m hugepagesz=2m hugepages=512 iommu=pt intel_iommu=on

執(zhí)行如下命令寫入引導(dǎo)項:

grub2-mkconfig -o /boot/grub2/grub.cfg

編輯/etc/fstab凡蚜,在最后增加如下內(nèi)容人断,在系統(tǒng)啟動時掛載大內(nèi)存頁。

nodev /mnt/huge hugetlbfs defaults 0 0

執(zhí)行如下命令創(chuàng)建掛載點:

mkdir -p /mnt/huge

編譯安裝Open vSwitch

執(zhí)行如下命令編譯安裝OVS:

cd /usr/src/

wget http://openvswitch.org/releases/openvswitch-2.8.1.tar.gz

tar -zxvf openvswitch-2.8.1.tar.gz

chown -R root:root openvswitch-2.8.1

cd openvswitch-2.8.1/

./boot.sh

./configure --with-dpdk=$DPDK_BUILD

make install

為了方便我們后面的配置番刊,把主機名改為ovs1含鳞。

編輯/etc/hostname即可。

執(zhí)行reboot重啟機器芹务。

復(fù)制虛擬機

為了我們能夠測試兩個虛擬機間的傳輸性能蝉绷,我們需要使用virtualbox復(fù)制一臺一樣的虛擬機,復(fù)制的時候記得選擇“網(wǎng)卡重新初始化選項”枣抱。復(fù)制完成后進行如下更改:
1熔吗、將網(wǎng)卡1的IP配置成192.168.56.161。
2佳晶、將hostname改為ovs2桅狠。

所有配置完成后,啟動ovs1和ovs2轿秧。

創(chuàng)建虛擬網(wǎng)橋(分別在ovs1和ovs2上執(zhí)行)

重啟機器后執(zhí)行如下命令將編譯好的dpdk驅(qū)動加載到系統(tǒng)內(nèi)核:

modprobe uio
insmod $DPDK_BUILD/kmod/igb_uio.ko

執(zhí)行如下命令查看當(dāng)前網(wǎng)卡綁定的情況:

$DPDK_DIR/usertools/dpdk-devbind.py --status

結(jié)果如下:

Network devices using DPDK-compatible driver
============================================
<none>

Network devices using kernel driver
===================================
0000:00:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s7 drv=e1000 unused= *Active*
0000:00:08.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s8 drv=e1000 unused=
0000:00:09.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s9 drv=e1000 unused=
0000:00:0a.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s10 drv=e1000 unused= *Active*

Other Network devices
=====================
<none>

Crypto devices using DPDK-compatible driver
===========================================
<none>

可以看到我們的4張網(wǎng)卡目前都是使用默認(rèn)的e1000驅(qū)動中跌。

執(zhí)行如下命令,將第二張網(wǎng)卡綁定到dpdk驅(qū)動:

$DPDK_DIR/usertools/dpdk-devbind.py --bind=igb_uio 0000:00:08.0

再次執(zhí)行$DPDK_DIR/usertools/dpdk-devbind.py --status結(jié)果如下:

Network devices using DPDK-compatible driver
============================================
0000:00:08.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=

Network devices using kernel driver
===================================
0000:00:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s7 drv=e1000 unused= *Active*
0000:00:09.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s9 drv=e1000 unused=igb_uio
0000:00:0a.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s10 drv=e1000 unused=igb_uio *Active*

Other Network devices
=====================
<none>

可以看到第二塊網(wǎng)卡已經(jīng)使用了DPDK驅(qū)動菇篡。

OK漩符,DPDK到此大功告成。

啟動OVS:

export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl start

啟動過程如下:

Starting ovsdb-server [ OK ]
system ID not configured, please use --system-id ... failed!
Configuring Open vSwitch system IDs [ OK ]
Inserting openvswitch module [ OK ]
Starting ovs-vswitchd Zone 0: name:<rte_eth_dev_data>, phys:0x7f9cecc0, len:0x30100, virt:0x7f1366dcecc0, socket_id:0, flags:0
[ OK ]
Enabling remote OVSDB managers

為什么我們要4張網(wǎng)卡驱还? 除了1張用于管理嗜暴,1張用于上外網(wǎng)凸克,另外兩張主要用于對比測試,第二張192.168.57.1/24網(wǎng)段使用dpdk驅(qū)動闷沥,第三張192.168.58.1/24使用普通網(wǎng)絡(luò)∥剑現(xiàn)在我們就創(chuàng)建兩個網(wǎng)橋br0和br1,分別將第二張網(wǎng)卡加入到br0舆逃、第三張網(wǎng)卡加入到br1蚂维。

首先對ovs進行dpdk初始化配置:

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

創(chuàng)建br0,將第二張網(wǎng)卡以DPDK設(shè)備形式加入到br0:

ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:00:08.0

0000:00:08.0為第二張網(wǎng)卡的ID路狮。

創(chuàng)建br1鸟雏,將第三張網(wǎng)卡加入到br1:

ovs-vsctl add-br br1
ovs-vsctl add-port br1 enp0s9

執(zhí)行ovs-vsctl show查看網(wǎng)橋配置情況如下:

c81a1a9a-ebfc-4aab-a008-24697f1ff1ca
Bridge "br0"
Port myportnameone
Interface myportnameone
type: dpdk
options: {dpdk-devargs="0000:00:08.0"}
Port "br0"
Interface "br0"
type: internal
Bridge "br1"
Port "br1"
Interface "br1"
type: internal
Port "enp0s9"
Interface "enp0s9"
ovs_version: "2.8.1"

上面的過程在ovs1和ovs2上完全相同,下過分別給兩個網(wǎng)橋配置ip览祖。

在ovs1上,執(zhí)行如下命令給br0和br1設(shè)置IP:

ifconfig br0 192.168.57.10/24 up

ifconfig br1 192.168.58.10/24 up

在ovs2上炊琉,執(zhí)行如下命令給br0和br1設(shè)置IP:

ifconfig br0 192.168.57.11/24 up

ifconfig br1 192.168.58.11/24 up

配置完成后展蒂,在ovs1上應(yīng)該通直接ping通 192.168.57.11 和 192.168.58.11

網(wǎng)速測試

我們使用iperf進行網(wǎng)速測試,在兩臺虛擬機上安裝iperf:

yum install iperf

在ovs1上關(guān)閉防火墻啟動服務(wù)端:

systemctl stop firewalld.service

iperf -s -i 1

在ovs2上執(zhí)行如下命令分別測試兩條鏈路的網(wǎng)速:

iperf -t 10 -i 1 -c 192.168.57.10

iperf -t 10 -i 1 -c 192.168.58.10

結(jié)果如下:

[root@ovs2 ~]# iperf -t 10 -i 1 -c 192.168.57.10
------------------------------------------------------------
Client connecting to 192.168.57.10, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.57.11 port 46748 connected with 192.168.57.10 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 16.2 MBytes 136 Mbits/sec
[ 3] 1.0- 2.0 sec 19.2 MBytes 161 Mbits/sec
[ 3] 2.0- 3.0 sec 19.2 MBytes 161 Mbits/sec
[ 3] 3.0- 4.0 sec 19.1 MBytes 160 Mbits/sec
[ 3] 4.0- 5.0 sec 17.5 MBytes 147 Mbits/sec
[ 3] 5.0- 6.0 sec 18.4 MBytes 154 Mbits/sec
[ 3] 6.0- 7.0 sec 18.6 MBytes 156 Mbits/sec
[ 3] 7.0- 8.0 sec 17.8 MBytes 149 Mbits/sec
[ 3] 8.0- 9.0 sec 17.8 MBytes 149 Mbits/sec
[ 3] 9.0-10.0 sec 17.5 MBytes 147 Mbits/sec
[ 3] 0.0-10.0 sec 181 MBytes 152 Mbits/sec
[root@ovs2 ~]# iperf -t 10 -i 1 -c 192.168.58.10
------------------------------------------------------------
Client connecting to 192.168.58.10, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.58.11 port 53078 connected with 192.168.58.10 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 158 MBytes 1.33 Gbits/sec
[ 3] 1.0- 2.0 sec 146 MBytes 1.23 Gbits/sec
[ 3] 2.0- 3.0 sec 147 MBytes 1.23 Gbits/sec
[ 3] 3.0- 4.0 sec 162 MBytes 1.36 Gbits/sec
[ 3] 4.0- 5.0 sec 153 MBytes 1.29 Gbits/sec
[ 3] 5.0- 6.0 sec 119 MBytes 998 Mbits/sec
[ 3] 6.0- 7.0 sec 135 MBytes 1.13 Gbits/sec
[ 3] 7.0- 8.0 sec 117 MBytes 980 Mbits/sec
[ 3] 8.0- 9.0 sec 168 MBytes 1.41 Gbits/sec
[ 3] 9.0-10.0 sec 161 MBytes 1.35 Gbits/sec
[ 3] 0.0-10.0 sec 1.43 GBytes 1.23 Gbits/sec

怎么樣苔咪? 結(jié)果是不是很驚人锰悼?

總結(jié)

為什么? 為什么团赏? 為什么箕般?為什么使用dpdk驅(qū)動的速度會比普通網(wǎng)卡的速度慢那么多呢?只有普通網(wǎng)卡的1/10舔清,理論和實踐為什么差距辣么大丝里?

我個人認(rèn)為可能是由于我的環(huán)境所致,本身虛擬機才2G內(nèi)存体谒,數(shù)據(jù)傳輸完成后杯聚,OVS還要進行大量的數(shù)據(jù)包處理,虛擬機cpu性能也不是很強抒痒,才會出現(xiàn)這樣的局面幌绍,這和我的預(yù)想完全相反,整個人感覺這幾天的工夫白花了故响。

當(dāng)然傀广,也可能是某些地方配置不對,希望各位指正彩届。

后續(xù)工作

現(xiàn)在需要在物理環(huán)境進行測試伪冰,但看了一下我手里的服務(wù)器網(wǎng)卡都不支持DPDK,特在此向各位征集網(wǎng)卡2張惨缆,要求intel的糜值,并且支持dpdk丰捷。

如果誰有可以和我聯(lián)系,微信: cj_zhao寂汇, 1周內(nèi)測試完成病往,原樣寄回,謝謝骄瓣!


如果您喜歡我的作品停巷,歡迎點贊、打賞榕栏、關(guān)注畔勤。
請我吃個雪糕……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扒磁,隨后出現(xiàn)的幾起案子庆揪,更是在濱河造成了極大的恐慌,老刑警劉巖妨托,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缸榛,死亡現(xiàn)場離奇詭異,居然都是意外死亡兰伤,警方通過查閱死者的電腦和手機内颗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敦腔,“玉大人均澳,你說我怎么就攤上這事》危” “怎么了找前?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長判族。 經(jīng)常有香客問我纸厉,道長,這世上最難降的妖魔是什么五嫂? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任颗品,我火速辦了婚禮,結(jié)果婚禮上沃缘,老公的妹妹穿的比我還像新娘躯枢。我一直安慰自己,他們只是感情好槐臀,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布锄蹂。 她就那樣靜靜地躺著,像睡著了一般水慨。 火紅的嫁衣襯著肌膚如雪得糜。 梳的紋絲不亂的頭發(fā)上敬扛,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音朝抖,去河邊找鬼啥箭。 笑死,一個胖子當(dāng)著我的面吹牛治宣,可吹牛的內(nèi)容都是我干的急侥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼侮邀,長吁一口氣:“原來是場噩夢啊……” “哼坏怪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绊茧,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铝宵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后华畏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捉超,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年唯绍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枝誊。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡况芒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叶撒,到底是詐尸還是另有隱情绝骚,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布祠够,位于F島的核電站压汪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏古瓤。R本人自食惡果不足惜止剖,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望落君。 院中可真熱鬧穿香,春花似錦、人聲如沸绎速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纹冤。三九已至洒宝,卻和暖如春购公,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雁歌。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工宏浩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人将宪。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓绘闷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親较坛。 傳聞我的和親對象是個殘疾皇子印蔗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容