Linux性能监控

Linux性能监控

linux

常用监控命令

查看机器重启的时间

$ date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
2017-10-19 22:33:51

top 查看CPU、进程相关

top - 19:19:27 up  3:47,  2 users,  load average: 0.08, 0.21, 0.25
Tasks: 625 total,   1 running, 624 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.3 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 26351737+total, 25943582+free,  2268316 used,  1813224 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 25959619+avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   8994 root      20   0  408120   8848   4036 S  11.3  0.0  24:37.84 nv-hostengine
   1663 root      20   0 6105524 115296  58616 S   4.6  0.0  11:21.27 kubelet
   4167 root      20   0 3082492 113180  40736 S   4.0  0.0   4:56.84 dockerd
   6371 root      10 -10 4235844 477552   8632 S   1.0  0.2   2:27.79 ovs-vswitchd
 358915 hzwengz+  20   0   43640   4164   3020 R   0.7  0.0   0:00.16 top
      8 root      20   0       0      0      0 S   0.3  0.0   0:08.89 rcu_sched
    402 root      20   0       0      0      0 S   0.3  0.0   0:00.25 kworker/2:1
   1236 root      20   0  206252 130096 126352 S   0.3  0.0   0:11.29 systemd-journal
   1616 root      20   0  254324   4356   2536 S   0.3  0.0   0:06.58 rsyslogd
   8995 root      20   0 2557228  13080   8928 S   0.3  0.0   0:27.75 pod-gpu-metrics

第1行任务队列信息:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30

内容 含义
05:43:27 表示当前时间
up 4:52 系统运行时间 格式为时:分
2 users 当前登录用户数
load average: 0.58, 0.41, 0.30 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。Load Average的值应该小于CPU个数*核数*0.7

第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie

内容 含义
159 total 进程总数
1 running 正在运行的进程数
158 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数

第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

内容 含义
37.0 us user用户空间占用CPU百分比。正常情况下只要服务器不是很闲,那么大部分的 CPU 时间应该都在此执行这类程序。
3.7 sy system内核空间占用CPU百分比。通常情况下该值会比较小,但是当服务器执行的 IO 比较密集的时候,该值会比较大。
0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
59.3 id idle空闲状态(执行 kernel idle handler)CPU百分比
0.0 wa iowait等待io输入输出的CPU时间百分比
0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比
0.0 si 软中断(Software Interrupts)占用CPU的百分比
0.0 st steal管理程序维护另一个虚拟处理器时,虚拟机等待 hypervisor 调度 CPU 的时间百分比

异常排查

us的值过高,表示某些用户的进程占用了大量的 CPU
system的值过高,可能有较多的IO操作
iowait的值过高,意味着某些程序的 IO 操作效率很低,表示硬盘存在I/O瓶颈
idle值高,表示CPU较空闲
idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。
steal值过高,表示虚拟机超售了

第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers

内容 含义
KiB Mem: 1530752 total 物理内存总量
1481968 used 使用的物理内存总量
48784 free 空闲内存总量
70988 buffers(buff/cache) 用作内核缓存的内存量

第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem

内容 含义
KiB Swap: 3905532 total 交换区总量
267544 used 使用的交换区总量
3637988 free 空闲交换区总量
617312 cached Mem 缓冲的交换区总量。
3156100 avail Mem 代表可用于进程下一次分配的物理内存数量

可用内存 = 第四行的free + 第四行的buffers + 第五行的cached

vmstat 查看CPU、内存、IO相关

vmstat,sar和iostat命令都包含在sysstat(系统监控工具)软件包中

# Virtual Meomory Statistics
$ vmstat 1 5 -S M # k, K, m or M (default is KiB)
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0    235   2728    269   2152    0    0     0     9    0    0  3  1 96  0  0
 0  0    235   2728    269   2152    0    0     0   104  394  735  3  2 96  0  0
 0  0    235   2727    269   2152    0    0     0     4  377  690  3  0 97  0  0
 0  0    235   2727    269   2152    0    0     0     0  351  715  3  1 96  0  0
 0  0    235   2727    269   2152    0    0     0     0  461  788  2  1 96  0  0
### 
r:处在 runnable 状态的任务,包括正在运行的任务和等待运行的任务。这个值比平均负载能更好地看出 CPU 是否饱和。这个值不包含等待 io 相关的任务。当 r 的值比当前 CPU 个数要大的时候,系统就处于饱和状态了。
free:以 KB 计算的空闲内存大小。
si,so:换入换出的内存页。如果这两个值非零,表示内存不够了。
us,sy,id,wa,st:CPU 时间的各项指标(对所有 CPU 取均值),分别表示:用户态时间,内核态时间,空闲时间,等待 io,偷取时间(在虚拟化环境下系统在其它租户上的开销)
###

mpstat 查看CPU相关

$ mpstat -P ALL
Linux 3.16.0-6-amd64 (tel-jumpserver)   11/14/2020      _x86_64_        (4 CPU)

10:58:28 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:58:28 AM  all    3.61    0.00    0.91    0.06    0.00    0.02    0.06    0.00    0.00   95.33
10:58:28 AM    0    3.74    0.00    0.94    0.07    0.00    0.03    0.08    0.00    0.00   95.15
10:58:28 AM    1    3.68    0.00    0.93    0.06    0.00    0.02    0.07    0.00    0.00   95.24
10:58:28 AM    2    3.58    0.00    0.89    0.06    0.00    0.02    0.05    0.00    0.00   95.40
10:58:28 AM    3    3.46    0.00    0.89    0.06    0.00    0.02    0.05    0.00    0.00   95.51

iostat 查看磁盘IO相关

$ iostat 1 2

$ iostat -p sdb
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.21    0.00    0.17    0.01    0.00   99.60

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb               4.44         7.41         8.34     798848     898840

$ iostat -d -x -k 1 2
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdt               0.01     8.49    0.27   13.76    16.87   631.68    92.44     0.01    0.96    4.42    0.89   0.06   0.08
sdd               0.00     0.00    0.55    4.04     8.68     8.32     7.40     0.00    0.05    0.16    0.04   0.05   0.02
sda               0.00     0.00    0.53    4.04     9.04     8.28     7.58     0.00    0.06    0.17    0.04   0.05   0.02

虚拟机在线不重启添加硬盘 for i in /sys/class/scsi_host/host*/scan;do echo "- - -" >$i;done

# 运行状态
uptime
# 日志
dmesg -T| tail

# pid
pidstat 1
# io
iostat -xz 1
# 内存
free -m
# 网卡
sar -n DEV 1
# 进程
sar -n TCP,ETCP 1
===
active/s:每秒钟本地主动开启的 TCP 连接,也就是本地程序使用 connect() 系统调用
passive/s:每秒钟从源端发起的 TCP 连接,也就是本地程序使用 accept() 所接受的连接
retrans/s:每秒钟的 TCP 重传次数
atctive 和 passive 的数目通常可以用来衡量服务器的负载:接受连接的个数(passive),下游连接的个数(active)。可以简单认为 active 为出主机的连接,passive 为入主机的连接;但这个不是很严格的说法,比如 loalhost 和 localhost 之间的连接。
===


dstat 查看CPU、内存、IO、网卡相关信息

sysstat相比,dstat是一个python编写的相对全能的工具,拥有彩色界面。

# cpu、disk、net、paging、system -cdngy
$ dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
  3   2  95   0   0   0|1504B 1405k|   0     0 |   0     0 |8706    58k
  2   2  96   0   0   0|   0   120k| 387k  419k|   0     0 |  16k   54k
 
# net、cpu、disk、mem、tcp
$ dstat -ntcdm --tcp
-net/total- ----system---- ----total-cpu-usage---- -dsk/total- ------memory-usage----- ----tcp-sockets----
 recv  send|     time     |usr sys idl wai hiq siq| read  writ| used  buff  cach  free|lis act syn tim clo
   0     0 |14-04 15:04:09|  3   2  95   0   0   0|1504B 1405k|38.2G 4197M  131G  206G| 52   4   2  18   0
 361k  456k|14-04 15:04:10|  1   2  96   0   0   0|   0    64k|38.2G 4197M  131G  206G| 52   4   2  18   0
 336k  367k|14-04 15:04:11|  2   2  96   0   0   0|   0  4096B|38.2G 4197M  131G  206G| 52   4   2  18   0

找出占用资源最高的进程和用户

$ dstat --top-mem --top-io --top-cpu
--most-expensive- ----most-expensive---- -most-expensive-
  memory process |     i/o process      |  cpu process
PM2 v2.9.1:  121G|bash          0     0 |getty        2.1
PM2 v2.9.1:  121G|                      |getty        2.1

iftop 查看网卡流量相关

$ iftop -n -i bond0

nload 查看网络带宽相关

nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单,不支持许多选项。

# 上、下键可以切换网卡
$ nload -t 200 -i 1024 -o 128 -U M
$ nload -t 200 bond0

nethogs 查看进程流量相关

$ sudo nethogs bond0.3002

sar查看网卡、CPU、内存、IO相关参数

常用参数

Usage: sar [ options ] [ <interval> [ <count> ] ]
-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
-n:DEV网络接口信息 | EDEV网络错误的统计数据 | NFS NFS客户端的信息| NFSD NFS服务器的信息 | SOCK套接字信息 | ALL
# 网卡流量,每一秒钟取1次值,取2次
sar -n DEV 1 2

要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来

  • 怀疑CPU存在瓶颈,可用 sar -usar -q 等来查看
  • 怀疑内存存在瓶颈,可用 sar -Bsar -rsar -W 等来查看
  • 怀疑I/O存在瓶颈,可用 sar -bsar -usar -d 等来查看

CPU资源监控

$ sar -u 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

10:39:28 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:39:30 PM     all      0.27      0.00      0.11      0.00      0.00     99.62
10:39:32 PM     all      0.13      0.00      0.15      0.00      0.00     99.72
10:39:34 PM     all      0.21      0.00      0.19      0.00      0.00     99.61
Average:        all      0.20      0.00      0.15      0.00      0.00     99.65

CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

inode、文件和其他内核表监控

$ sar -v 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

10:40:42 PM dentunusd   file-nr  inode-nr    pty-nr
10:40:44 PM    361579      6832    163416         3
10:40:46 PM    361457      6720    163306         3
10:40:48 PM    361448      6608    163287         3
Average:       361495      6720    163336         3

dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的pty数量

内存和交换空间监控

$ sar -r 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

10:41:40 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
10:41:42 PM 251128964  12406412      4.71   1214024   2808424  30464568     11.56   8922432   1882688       168
10:41:44 PM 251125204  12410172      4.71   1214024   2808508  30432984     11.55   8925864   1882764       180
10:41:46 PM 251127356  12408020      4.71   1214024   2808548  30414880     11.54   8923240   1882808       196
Average:    251127175  12408201      4.71   1214024   2808493  30437477     11.55   8923845   1882753       181

kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
$ sar -B 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

10:42:27 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
10:42:29 PM      0.00    312.00   5656.00      0.00   7310.50      0.00      0.00      0.00      0.00
10:42:31 PM      0.00    196.00   8574.00      0.00  14734.00      0.00      0.00      0.00      0.00
10:42:33 PM      0.00    232.00   3498.00      0.00   8107.00      0.00      0.00      0.00      0.00
Average:         0.00    246.67   5909.33      0.00  10050.50      0.00      0.00      0.00      0.00

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

I/O和传送速率监控

$ sar -b 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org)   06/16/2020      _x86_64_        (56 CPU)

10:43:04 PM       tps      rtps      wtps   bread/s   bwrtn/s
10:43:06 PM     81.00      0.00     81.00      0.00    476.00
10:43:08 PM     84.00      0.00     84.00      0.00    544.00
10:43:10 PM     88.50      0.00     88.50      0.00    620.00
Average:        84.50      0.00     84.50      0.00    546.67

tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s

设备使用情况监控

$ sar -d 2 1 -p
Linux 4.9.65-netease (pubbeta2-curve3.dg.163.org)       06/16/2020      _x86_64_        (56 CPU)

10:45:43 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
10:45:45 PM       sda     49.00      0.00    732.00     14.94      0.01      0.20      0.20      1.00
10:45:45 PM      nbd0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:45:45 PM      nbd1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:45:45 PM      nbd2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:45:45 PM      nbd3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:45:45 PM      nbd4      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:45:45 PM      nbd5      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:          sda     49.00      0.00    732.00     14.94      0.01      0.20      0.20      1.00
Average:         nbd0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         nbd1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         nbd2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         nbd3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         nbd4      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         nbd5      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s:每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱和.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容