20221204-Linux服务器如何进行压力测试

Linux服务器如何进行压力测试

Linux服务器压力测试的目的

Linux压力测试是检验交付Linux服务器性能稳定性的最有效方式。在业务还未部署的情况下,可以通过对服务器CPU、内存、磁盘IO进行简单压力测试,提前暴露硬件问题。

stress-ng进行Linux系统压力测试(CPU、内存、磁盘IO)

一).环境

OS:CentOS Linux release 7.4

# more /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

CPU:1核心
Memory:1GB

二).stress-ng作用及常用参数

stress-ng兼容stress, 支持产生对CPU、内存、磁盘等各种复杂的压力测试。
常用命令参数如下:

选项 含义
-t, --timeout 指定运行多少秒停止
–backoff 指定等待N微妙后开始运行
-c, --cpu 指定产生N个处理sqrt()函数的CPU进程,也就是每个进程不停计算随机数的平方根
-i, --io 指定产生N个处理sync()函数的磁盘I/O进程,sync()用于将内存上的内容写到硬盘上
-m, --vm 指定产生n个进程,每个进程不断调用内存分配malloc函数和内存释放free函数
–vm-bytes 指定调用malloc函数时分配内存的字节数 (默认256MB)
–vm-stride 应该是给内存赋值,touch a byte every B bytes (default is 4096)
–vm-hang 指定malloc函数分配的内存转入睡眠状态 N 秒,然后free()释放掉,一直重复执行这个过程
–vm-keep 冗余内存,而不是释放和重新分配
-d, --hdd 指定产生N个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件)
–hdd-bytes 指定写入文件大小,默认为1GB

三).stress-ng安装

1.获取stress-ng安装包

# wget https://fossies.org/linux/privat/stress-ng-0.15.00.tar.gz

2.解压缩stress-ng安装包

# tar xf stress-ng-0.15.00.tar.gz

3.编译

# cd stress-ng-0.15.00/
# make

4.安装

# make install
mkdir -p /usr/bin
cp stress-ng /usr/bin
mkdir -p /usr/share/man/man1
cp stress-ng.1.gz /usr/share/man/man1
mkdir -p /usr/share/stress-ng/example-jobs
cp -r example-jobs/*.job /usr/share/stress-ng/example-jobs
mkdir -p /usr/share/bash-completion/completions
cp bash-completion/stress-ng /usr/share/bash-completion/completions

5.确认安装版本

# stress-ng --version
stress-ng, version 0.15.00 (gcc 4.8, x86_64 Linux 3.10.0-693.11.6.el7.x86_64)

四).通过stress-ng进行压力测试

查看CPU个数等情况

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 78
model name      : Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
stepping        : 3
microcode       : 0xcc
cpu MHz         : 2400.002
cache size      : 3072 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch spec_ctrl ibpb_support fsgsbase smep arat
bogomips        : 4800.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

查看内存大小等情况

# cat /proc/meminfo
MemTotal:        1007600 kB
MemFree:          352660 kB
MemAvailable:     553008 kB
Buffers:            2116 kB
Cached:           317624 kB
SwapCached:            0 kB
Active:           265148 kB
Inactive:         239676 kB
Active(anon):     186020 kB
Inactive(anon):     6552 kB
Active(file):      79128 kB
Inactive(file):   233124 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        185116 kB
Mapped:            87716 kB
Shmem:              7488 kB
Slab:              62788 kB
SReclaimable:      31696 kB
SUnreclaim:        31092 kB
KernelStack:        4736 kB
PageTables:        14712 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2600948 kB
Committed_AS:    1236704 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      176160 kB
VmallocChunk:   34359326716 kB
HardwareCorrupted:     0 kB
AnonHugePages:     40960 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       77696 kB
DirectMap2M:      970752 kB
DirectMap1G:           0 kB

查看磁盘大小等情况

# df -h
Filesystem                          Size  Used Avail Use% Mounted on
/dev/mapper/centos_chefserver-root   17G   10G  7.1G  59% /
devtmpfs                            477M     0  477M   0% /dev
tmpfs                               492M     0  492M   0% /dev/shm
tmpfs                               492M  7.2M  485M   2% /run
tmpfs                               492M     0  492M   0% /sys/fs/cgroup
/dev/sda1                          1014M  217M  798M  22% /boot
tmpfs                                99M   12K   99M   1% /run/user/42
tmpfs                                99M     0   99M   0% /run/user/0

查看压测前进程状况

# top

查看压测前内存状况

# free

CPU压测:开启1个CPU进程执行sqrt计算,180秒后结束

# stress-ng --cpu 1 --timeout 180
stress-ng: info:  [10412] setting to a 180 second (3 mins, 0.00 secs) run per stressor
stress-ng: info:  [10412] dispatching hogs: 1 cpu
stress-ng: info:  [10412] successful run completed in 180.00s (3 mins, 0.00 secs)

# stress-ng --cpu 1 --timeout 604800
##进行连续7*24小时运算

内存压测:开启4个进程分配内存,每次分配512M,保持180秒后释放,180秒后退出

# stress-ng --vm 4 --vm-bytes 512M --vm-hang 180 --timeout 180s
stress-ng: info:  [10231] setting to a 180 second (3 mins, 0.00 secs) run per stressor
stress-ng: info:  [10231] dispatching hogs: 4 vm
stress-ng: warn:  [10231] metrics-check: all bogo-op counters are zero, data may be incorrect
stress-ng: info:  [10231] successful run completed in 180.04s (3 mins, 0.04 secs)

压测磁盘io:开启5个磁盘IO进程,每次写1GB数据到磁盘,180秒后退出

# stress-ng --hdd 5 --hdd-bytes 1G --timeout 180s
stress-ng: info:  [10527] setting to a 180 second (3 mins, 0.00 secs) run per stressor
stress-ng: info:  [10527] dispatching hogs: 5 hdd
stress-ng: info:  [10527] successful run completed in 182.16s (3 mins, 2.16 secs)

FIO进行Linux系统压力测试(磁盘IO)

一).环境

OS:CentOS Linux release 7.4

# more /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

CPU:1核心
Memory:1GB

二).FIO作用及常用参数

FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是说FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)

FIO 命令常用参数:

参数说明:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。 
rw=randwrite 测试随机写的I/O
rw=randread:测试随机读的I/O
rw=randrw 测试随机写和读的I/O
rw=read:测试读的I/O
rw=write:测试写的I/O

bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围
size=5G 每个线程读写的数据量是5GB。
numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。 
name=job1:一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。 
thread  使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。 
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
allow_mounted_write=1 是否允许对存储设备写入数据,各取值含义,1:允许,0:不允许
ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados 
iodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
Block Devices(RBD),无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
磁盘读写常用测试点:
1. Read=100% Ramdon=100% rw=randread (100%随机读)
2. Read=100% Sequence=100% rw=read (100%顺序读)
3. Write=100% Sequence=100% rw=write (100%顺序写)
4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
(70%顺序读,30%顺序写)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%随机读,30%随机写)

三).fio安装

1.获取fio安装包

# wget https://brick.kernel.dk/snaps/fio-2.1.10.tar.gz --no-check-certificate

2.解压缩fio安装包

# tar xf fio-2.1.10.tar.gz 

3.编译

安装fio工具依赖的软件包libaio-devel
# yum install libaio-devel
# cd fio-2.1.10/
# ./configure
# make

4.安装

# make install
install -m 755 -d /usr/local/bin
install fio tools/fio_generate_plots tools/plot/fio2gnuplot tools/genfio /usr/local/bin
install -m 755 -d /usr/local/man/man1
install -m 644 fio.1 /usr/local/man/man1
install -m 644 tools/fio_generate_plots.1 /usr/local/man/man1
install -m 644 tools/plot/fio2gnuplot.1 /usr/local/man/man1
install -m 755 -d /usr/local/share/fio
install -m 644 tools/plot/*gpm /usr/local/share/fio/

5.确认安装版本

# fio -version
fio-2.1.10

四).通过FIO进行压力测试

FIO例子:单次io的块文件大小为4k,使用directIO,使用pthread_create创建线程,队列的深度为16

# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60

BS 4KB read test: (g=0): rw=read, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=16
fio-2.1.10
Starting 1 thread
Jobs: 1 (f=1): [R] [5.3% done] [105KB/0KB/0KB /s] [26/0/0 iops] [eta 18m:11s]      
BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=14689: Sun Dec  4 01:52:28 2022
  read : io=1083.9MB, bw=18323KB/s, iops=4580, runt= 60571msec
    slat (usec): min=23, max=27887, avg=62.91, stdev=142.56
    clat (usec): min=1, max=782461, avg=3425.69, stdev=23047.85
     lat (usec): min=45, max=782608, avg=3489.34, stdev=23059.79
    clat percentiles (usec):
     |  1.00th=[  668],  5.00th=[  692], 10.00th=[  708], 20.00th=[  724],
     | 30.00th=[  732], 40.00th=[  756], 50.00th=[  780], 60.00th=[  852],
     | 70.00th=[ 1064], 80.00th=[ 1704], 90.00th=[ 4320], 95.00th=[ 6432],
     | 99.00th=[42240], 99.50th=[166912], 99.90th=[387072], 99.95th=[399360],
     | 99.99th=[643072]
    bw (KB  /s): min=   91, max=75016, per=100.00%, avg=18788.61, stdev=26522.46
    lat (usec) : 2=0.01%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.02%
    lat (usec) : 250=0.07%, 500=0.11%, 750=38.31%, 1000=29.12%
    lat (msec) : 2=14.61%, 4=6.90%, 10=9.26%, 20=0.52%, 50=0.28%
    lat (msec) : 100=0.17%, 250=0.31%, 500=0.28%, 750=0.02%, 1000=0.01%
  cpu          : usr=0.60%, sys=30.55%, ctx=26540, majf=0, minf=24
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=277454/w=0/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=16

Run status group 0 (all jobs):
   READ: io=1083.9MB, aggrb=18322KB/s, minb=18322KB/s, maxb=18322KB/s, mint=60571msec, maxt=60571msec

Disk stats (read/write):
  sda: ios=277450/57, merge=0/8, ticks=737638/184, in_queue=740248, util=99.04%

FIO压测结果说明:

io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS,每秒的输入输出量
runt=线程运行时间
slat=提交延迟,提交该IO请求到kernel所花的时间(不包括kernel处理的时间)
clat=完成延迟, 提交该IO请求到kernel后,处理所花的时间
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延迟的分布

io=总共执行了多少size的IO
aggrb=group总带宽
minb=最小.平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.

ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率

顺序读

# fio -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=1m -rw=read -numjobs=1 --ramp_time=10 -runtime=20m -group_reporting -name=mytest

顺序写:

# fio -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=1m -rw=write -numjobs=1 --ramp_time=10 -runtime=20m -group_reporting -name=mytest

随机读:

# fio  -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=4k -rw=randread -numjobs=4  --ramp_time=10 -runtime=20m -group_reporting -name=mytest

随机写:

# fio  -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=4k -rw=randwrite -numjobs=4 --ramp_time=10 -runtime=20m -group_reporting -name=mytest

memtester进行Linux系统压力测试(内存)

一).环境

OS:CentOS Linux release 7.4

# more /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

CPU:1核心
Memory:1GB

二).memtester作用及常用参数

一款在用户空间下,用于测试内存正确性的实用工具,适用于大多数平台。可以在32位或64位的类Unix操作系统编译和运行(当然也包括MacOs)。这款工具主要面向硬件开发人员,从4.1.0版本开始,memtester可以指定起始物理内存地址进行测试。

memtester 命令常用参数:

Usage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]
参数解释
-p PHYSADDR: 用于指定起始物理内存地址开始测试(16进制的地址格式),一般是硬件工程师用来测试内存映射的设备IO等场景。指定内存地址会覆盖对应地址的内存数据(这部分内存可能是系统或者其他应用在用的),从而导致crash。
-d 默认使用/dev/mem,我们不用指定 mem: 默认使用M(MB),可以指定B, K, M, or G(分别代表 bytes, kilobytes, megabytes, or gigabytes)
loops:测试次数,默认无限次数执行下去

三).memtester安装

1.获取memtester安装包

# wget https://fossies.org/linux/misc/memtester-4.5.1.tar.gz

2.解压缩fio安装包

# tar xf memtester-4.5.1.tar.gz 

3.编译

# cd memtester-4.5.1/
# make

4.安装

# make install
mkdir -m 755 -p /usr/local/bin
install -m 755 memtester /usr/local/bin/
mkdir -m 755 -p /usr/local/man/man8
gzip -c memtester.8 >memtester.8.gz ; install -m 644 memtester.8.gz /usr/local/man/man8/

5.确认安装版本

# memtester version
memtester version 4.5.1 (64-bit)
Copyright (C) 2001-2020 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000

四).通过memtester进行压力测试

内存压测:分配512m内存用于memtester,循环1次

# memtester 512M  1

memtester version 4.5.1 (64-bit)
Copyright (C) 2001-2020 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 512MB (536870912 bytes)
got  512MB (536870912 bytes), trying mlock ...locked.
Loop 1/1:
  Stuck Address       : ok         
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok         
  Block Sequential    : ok         
  Checkerboard        : ok         
  Bit Spread          : ok         
  Bit Flip            : ok         
  Walking Ones        : ok         
  Walking Zeroes      : ok         
  8-bit Writes        : ok
  16-bit Writes       : ok

Done.

退出码

0:正常退出 
x01:内存分配或者锁定失败 
x02:stuck Address测试失败 
x04:其他测试失败 

最佳实践

1.在32位系统上运行memtester的话,memtester最多只能申请使用**4GB**内存。 
2.不要指定memtester测试内存大于系统的可用内存,如果超额申请过多内存,会明显影响其他进程,最终可能会被系统杀掉(OOM killer)(其实这么做根本无法启动memtester) 
3.尽量在root权限下执行memtester,以便让memtester能申请到指定的内存大小。

Linux压力测试的判断

测试通过标准:

1.测试时间周期内及过程中未出现系统无法响应的情况;
2.测试过程中监控内存和CPU频率、带宽、温度、功耗,无降频现象,过程中内存带宽保持满负载运行,温度与功耗平稳。
3.检查测试时间周期内系统日志,无异常。

关联URL:
Fossies(The Fresh Open Source Software Archive):https://fossies.org/
FIO github:https://github.com/axboe/fio

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容