day 22 ----進程管理及平均負載相關知識

一罩缴、管理進程狀態(tài)

當程序運行為進程后,如果希望停止進程聂宾,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發(fā)送關閉信號。當然除了kill诊笤、還有killall系谐,pkill

1.使用 kill -l 列出當前系統(tǒng)所支持的信號,但是我們常用的信號就三個

image.png
1    SIGHUP     通常用來重新加載配置文件
9    SIGKILL    強制殺死進程
15   SIGTERM    終止進程讨跟,默認kill使用該信號

2.我們使用kill命令殺死指定子進程(PID)的進程纪他。

1.給 vsftpd 進程發(fā)送信號 1,15
[root@zhangwanshun~]# yum -y install vsftpd
[root@zhangwanshun~]# systemctl start vsftpd
[root@zhangwanshun~]# ps aux|grep vsftpd
#2.發(fā)送重載信號,例如 vsftpd 的配置文件發(fā)生改變晾匠,希望重新加載
[root@zhangwanshun~]# kill -1 9161
#3.發(fā)送停止信號茶袒,當然vsftpd 服務有停止的腳本 systemctl stop vsftpd
[root@zhangwanshun ~]# kill 9161
#4.發(fā)送強制停止信號,當無法停止服務時凉馆,可強制終止信號
[root@zhangwanshun ~]# kill -9 9161

3.Linux系統(tǒng)中的killall薪寓、pkill命令用于殺死指定名字的進程。我們可以使用kill命令殺死指定進程PID的進程澜共,如果要找到我們需要殺死的進程预愤,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall咳胃、pkill把這兩個過程合二為一,是一個很好用的命令

例1旷太、通過服務名稱殺掉進程
[root@zhangwanshun~]# pkill nginx
[root@zhangwanshun~]# killall nginx

#例2展懈、使用pkill踢出從遠程登錄到本機的用戶,終止pts/0上所有進
程, 并且bash也結(jié)束(用戶被強制退出)
[root@zhangwanshun ~]# pkill -9 -t pts/0

二供璧、管理后臺進程

1.什么是后臺進程存崖?

將在前臺運行的進程放入后臺運行,這樣及時我們關閉了終端也不影響進程的正常運行睡毒。

2.使用什么工具將進程放入后臺

早期的時候大家都選擇使用&符號將進程放入后臺来惧,然后在使用jobs、bg演顾、fg等方式查看進程狀態(tài)供搀,但太麻煩了隅居。也不直觀,所以我們推薦使用screen(重要命令)葛虐。

3.screen的使用(強烈推薦胎源,生產(chǎn)必用)

1.安裝
[root@oldboy ~]# yum install screen -y

#2.開啟一個screen窗口,指定名稱
[root@oldboy ~]# screen -S  wget_mysql

#3.在screen窗口中執(zhí)行任務即可

#4.平滑的退出screen,但不會終止screen中的任務,使用的命令為ctrl+a+d。
注意: 如果使用exit 才算真的關閉screen窗口

#5.查看當前正在運行的screen有哪些
[root@oldboy ~]# screen -list
    There is a screen on:
    22058.wget_mysql      (Detached)
1 Socket in /var/run/screen/S-root.

#6.進入正在運行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058

三屿脐、進程的優(yōu)先級[進階]

1.系統(tǒng)中如何給進程配置優(yōu)先級?

在啟動進程時涕蚤,為不同的進程使用不同的調(diào)度策略。
nice 值越高: 表示優(yōu)先級越低的诵,例如+19万栅,該進程容易將CPU 使用量讓給其他進程。
nice 值越低: 表示優(yōu)先級越高西疤,例如 -20烦粒,該進程更不傾向于讓出CPU。

2.使用top或ps命令查看進程的優(yōu)先級

#1.使用top可以查看nice優(yōu)先級瘪阁。  NI: 實際nice級別撒遣, 默認是0。 
PR: 顯示nice值管跺,  -20映射到 0义黎, +19映射到39

PID USER      PR    NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND

1083 root      20   0  298628   2808   1544 S  0.3  0.1   2:49.28 vmtoolsd

5    root       0 -20       0      0      0 S  0.0  0.0   0:00.00   
kworker/0:+

#2.使用ps查看進程優(yōu)先級
[root@name ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D             0
sshd: root@pts/2              0

3.nice指定程序的優(yōu)先級。語法格式 nice -n 優(yōu)先級數(shù)字 進程名稱

#1.開啟vim并且指定程序優(yōu)先級為-5
 [root@name ~]# nice -n -5 vim &
  [1] 98417

#2.查看該進程的優(yōu)先級情況
[root@name ~]# ps axo pid,command,nice |grep 98417
 98417 vim       -5

4.renice命令修改一個正在運行的進程優(yōu)先級豁跑。語法格式 renice -n 優(yōu)先級數(shù)字進程pid

#1.查看sshd進程當前的優(yōu)先級狀態(tài)
[root@name ~]# ps axo pid,command,nice |grep 折疊shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D             0
 
#2.調(diào)整sshd主進程的優(yōu)先級
[root@name~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20

#3.調(diào)整之后記得退出終端
[root@name ~]# ps axo pid,command,nice |grep 折疊shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D           -20
[root@name ~]# exit

#4.當再次登陸sshd服務廉涕,會由主進程fork子進程(那么子進程會繼承主進程的優(yōu)先級)
[root@name ~]# ps axo pid,command,nice |grep 折疊shd
 98002 /usr/sbin/sshd -D           -20
 98122 sshd: root@pts/0            -20

四、系統(tǒng)平均負載[進階]

[root@name ~]# uptime
 04:49:26 up 2 days,  2:33,  2 users,  load average: 0.70, 0.04, 0.05
#我們已經(jīng)比較熟悉前面幾列艇拍,它們分別是當前時間狐蜕、系統(tǒng)運行時間以及正在登錄用戶數(shù)。

# 而最后三個數(shù)字呢卸夕,依次則是過去 1 分鐘层释、5 分鐘、15 分鐘的
平均負載(Load Average)快集。

1.什么是平均負載

平均負載不就是單位時間內(nèi)的 CPU 使用率嗎贡羔?上面的 0.70,就代表 CPU 使用率是 70%个初。其實上并.....
那到底如何理解平均負載: 平均負載是指單位時間內(nèi)乖寒,系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù),也就是平均活躍進程數(shù)院溺, PS: 平均負載與 CPU 使用率并沒有直接關系楣嘁。

2.可運行狀態(tài)和不可中斷狀態(tài)是什么

1.可運行狀態(tài)進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們ps 命令看到處于 R 狀態(tài)的進程逐虚。
2.不可中斷進程聋溜,(你做什么事情的時候是不能打斷的?) 系統(tǒng)中最常見的是等待硬件設備的 I/O 響應,也就是我們 ps 命令中看到的 D 狀態(tài)(也稱為 Disk Sleep)的進程痊班。
例如: 當一個進程向磁盤讀寫數(shù)據(jù)時勤婚,為了保證數(shù)據(jù)的一致性,在得到磁盤回復前涤伐,它是不能被其他進程或者中斷打斷的馒胆,這個時候的進程就處于不可中斷狀態(tài)。如果此時的進程被打斷了凝果,就容易出現(xiàn)磁盤數(shù)據(jù)與進程數(shù)據(jù)不一致的問題祝迂。所以,不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設備的一種保護機制器净。

劃重點型雳,因此你可以簡單理解為,平均負載其實就是單位時間內(nèi)的活躍進程數(shù)山害。

3.那平均負載為多少時合理

最理想的狀態(tài)是每個 CPU 上都剛好運行著一個進程纠俭,這樣每個 CPU 都得到了充分利用。所以在評判平均負載時浪慌,首先你要知道系統(tǒng)有幾個 CPU冤荆,這可以通過 top 命令獲取,或grep 'model name' /proc/cpuinfo

例1权纤、假設現(xiàn)在在 4钓简、2、1核的CPU上汹想,如果平均負載為 2 時外邓,意味著什么呢?
Q1.在4 個 CPU 的系統(tǒng)上古掏,意味著 CPU 有 50% 的空閑损话。
Q2.在2 個 CPU 的系統(tǒng)上,意味著所有的 CPU 都剛好被完全占用槽唾。
Q3.而1 個 CPU 的系統(tǒng)上席镀,則意味著有一半的進程競爭不到 CPU。

PS: 平均負載有三個數(shù)值夏漱,我們應該關注哪個呢?
實際上,我們都需要關注顶捷。就好比上海4月的天氣挂绰,如果只看晚上天氣,感覺在過冬天呢。但如果你結(jié)合了早上葵蒂、中午交播、晚上三個時間點的溫度來看,基本就可以全方位了解這一天的天氣情況了践付。

1.如果 1 分鐘秦士、5 分鐘、15 分鐘的三個值基本相同永高,或者相差不大隧土,那就說明系統(tǒng)負載很平穩(wěn)。
2.但如果 1 分鐘的值遠小于 15 分鐘的值命爬,就說明系統(tǒng)最近 1 分鐘的負載在減少曹傀,而過去 15 分鐘內(nèi)卻有很大的負載。
3.反過來饲宛,如果 1 分鐘的值遠大于 15 分鐘的值皆愉,就說明最近 1 分鐘的負載在增加,這種增加有可能只是臨時性的艇抠,也有可能還會持續(xù)上升幕庐,所以就需要持續(xù)觀察。
PS: 一旦 1 分鐘的平均負載接近或超過了 CPU 的個數(shù)家淤,就意味著系統(tǒng)正在發(fā)生過載的問題异剥,這時就得分析問題,并要想辦法優(yōu)化了

在來看個例子3媒鼓、假設我們在有2個 CPU 系統(tǒng)上看到平均負載為 2.73届吁,6.90,12.98
那么說明在過去1 分鐘內(nèi)绿鸣,系統(tǒng)有 136% 的超載 (2.73/2=136%)
而在過去 5 分鐘內(nèi)疚沐,有 345% 的超載 (6.90/2=345%)
而在過去15 分鐘內(nèi),有 649% 的超載潮模,(12.98/2=649%)
但從整體趨勢來看亮蛔,系統(tǒng)的負載是在逐步的降低。

4.那么在實際生產(chǎn)環(huán)境中擎厢,平均負載多高時究流,需要我們重點關注呢?

當平均負載高于 CPU 數(shù)量 70% 的時候动遭,你就應該分析排查負載高的問題了芬探。一旦負載過高,就可能導致進程響應變慢厘惦,進而影響服務的正常功能偷仿。
但 70% 這個數(shù)字并不是絕對的,最推薦的方法,還是把系統(tǒng)的平均負載監(jiān)控起來酝静,然后根據(jù)更多的歷史數(shù)據(jù)节榜,判斷負載的變化趨勢。當發(fā)現(xiàn)負載有明顯升高趨勢時别智,比如說負載翻倍了宗苍,你再去做分析和調(diào)查。

5.平均負載與 CPU 使用率有什么關系

在實際工作中薄榛,我們經(jīng)常容易把平均負載和 CPU 使用率混淆讳窟,所以在這里,我也做一個區(qū)分蛇数∨驳觯可能你會疑惑,既然平均負載代表的是活躍進程數(shù)耳舅,那平均負載高了碌上,不就意味著 CPU 使用率高嗎?
我們還是要回到平均負載的含義上來浦徊,平均負載是指單位時間內(nèi)馏予,處于可運行狀態(tài)和不可中斷狀態(tài)的進程數(shù)。所以盔性,它不僅包括了正在使用 CPU 的進程霞丧,還包括等待 CPU 和等待 I/O 的進程。

而 CPU 使用率冕香,是單位時間內(nèi) CPU 繁忙情況的統(tǒng)計蛹尝,跟平均負載并不一定完全對應。比如:
CPU 密集型進程悉尾,使用大量 CPU 會導致平均負載升高突那,此時這兩者是一致的;
I/O 密集型進程构眯,等待 I/O 也會導致平均負載升高愕难,但 CPU 使用率不一定很高;
大量等待 CPU 的進程調(diào)度也會導致平均負載升高惫霸,此時的 CPU 使用率也會比較高猫缭。

6.平均負載案例分析實戰(zhàn)

下面,我們以三個示例分別來看這三種情況壹店,并用 stress猜丹、mpstat、pidstat 等工具硅卢,找出平均負載升高的根源射窒。
stress 是 Linux 系統(tǒng)壓力測試工具妖混,這里我們用作異常進程模擬平均負載升高的場景。
mpstat 是多核 CPU 性能分析工具轮洋,用來實時查看每個 CPU 的性能指標,以及所有 CPU 的平均指標抬旺。
pidstat 是一個常用的進程性能分析工具弊予,用來實時查看進程的 CPU、內(nèi)存开财、I/O 以及上下文切換等性能指標汉柒。

7.如果出現(xiàn)無法使用mpstat、pidstat命令查看%wait指標建議更新下軟件包

wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm

場景一:CPU 密集型進程
1.首先责鳍,我們在第一個終端運行 stress 命令碾褂,模擬一個 CPU 使用率 100% 的場景:

[root@name~]# stress --cpu 1 --timeout 600

2.接著,在第二個終端運行 uptime 查看平均負載的變化情況

# 使用watch -d 參數(shù)表示高亮顯示變化的區(qū)域(注意負載會持續(xù)升高)
[root@name~]# watch -d uptime
17:27:44 up 2 days,  3:11,  3 users,  load average: 1.10, 0.30, 0.17

3.最后历葛,在第三個終端運行 mpstat 查看 CPU 使用率的變化情況

# -P ALL 表示監(jiān)控所有 CPU正塌,后面數(shù)字 5 表示間隔 5 秒后輸出一組數(shù)據(jù)
[root@name~]# mpstat -P ALL 5
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_    (1 CPU)

17時32分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時32分08秒  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17時32分08秒    0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00

#單核CPU所以只有一個all和0

4.從終端二中可以看到,1 分鐘的平均負載會慢慢增加到 1.00恤溶,而從終端三中還可以看到乓诽,正好有一個 CPU 的使用率為 100%,但它的 iowait 只有 0咒程。這說明鸠天,平均負載的升高正是由于 CPU 使用率為 100% 。那么帐姻,到底是哪個進程導致了 CPU 使用率為 100% 呢稠集?可以使用 pidstat 來查詢

# 間隔 5 秒后輸出一組數(shù)據(jù)
[root@name ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_(1 CPU)

17時33分21秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時33分26秒     0    110019   98.80    0.00    0.00   98.80     0  stress

#從這里可以明顯看到,stress 進程的 CPU 使用率為 100%饥瓷。

場景二:I/O 密集型進程

1.首先還是運行 stress 命令剥纷,但這次模擬 I/O 壓力,即不停地執(zhí)行 sync

[root@name ~]# stress  --io 1 --timeout 600s

2.然后在第二個終端運行 uptime 查看平均負載的變化情況:

[root@name ~]# watch -d uptime
18:43:51 up 2 days,  4:27,  3 users,  load average: 1.12, 0.65, 0.00

3.最后第三個終端運行 mpstat 查看 CPU 使用率的變化情況:

# 顯示所有 CPU 的指標扛伍,并在間隔 5 秒輸出一組數(shù)據(jù)
[root@name ~]# mpstat -P ALL 5
Linux 3.10.0-693.2.2.el7.x86_64 (bgx.com)   2019年05月07日     
_x86_64_    (1 CPU)

14時20分07秒  CPU    %usr   %nice    %sys %iowait    %irq   
%soft  %steal  %guest  %gnice   %idle
14時20分12秒  all    0.20    0.00   82.45   17.35    0.00    0.00    0.00    0.00    0.00    0.00
14時20分12秒    0    0.20    0.00   82.45   17.35    0.00    0.00    0.00    0.00    0.00    0.00

#會發(fā)現(xiàn)cpu的與內(nèi)核打交道的sys占用非常高

4.那么到底是哪個進程筷畦,導致 iowait 這么高呢?我們還是用 pidstat 來查詢

# 間隔 5 秒后輸出一組數(shù)據(jù)刺洒,-u 表示 CPU 指標
[root@m01 ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     
_x86_64_(1 CPU)
18時29分37秒   UID       PID    %usr %system  %guest   %wait    
%CPU   CPU  Command
18時29分42秒     0    127259   32.60    0.20    0.00   67.20   32.80     
0  stress
18時29分42秒     0    127261    4.60   28.20    0.00   67.20   32.80     
0  stress
18時29分42秒     0    127262    4.20   28.60    0.00   67.20   32.80     
0  stress

#可以發(fā)現(xiàn)鳖宾,還是 stress 進程導致的。

場景三:大量進程的場景
當系統(tǒng)中運行進程超出 CPU 運行能力時逆航,就會出現(xiàn)等待 CPU 的進程鼎文。

1.首先,我們還是使用 stress因俐,但這次模擬的是 4 個進程

[root@name~]# stress -c 4 --timeout 600

2.由于系統(tǒng)只有 1 個 CPU拇惋,明顯比 4 個進程要少得多周偎,因而,系統(tǒng)的 CPU 處于嚴重過載狀態(tài)

[root@m01 ~]# watch -d uptime
19:11:07 up 2 days,  4:45,  3 users,  load average: 4.65, 2.65, 4.65

3.然后撑帖,再運行 pidstat 來看一下進程的情況:

# 間隔 5 秒后輸出一組數(shù)據(jù)
[root@m01 ~]# pidstat -u 5 1
平均時間:   UID       PID    %usr %system  %guest   %wait    
%CPU   CPU  Command
平均時間:     0    130290   24.55    0.00    0.00   75.25   24.55     -  
stress
平均時間:     0    130291   24.95    0.00    0.00   75.25   24.95     -  
stress
平均時間:     0    130292   24.95    0.00    0.00   75.25   24.95     -  
stress
平均時間:     0    130293   24.75    0.00    0.00   74.65   24.75     -  
stress

可以看出蓉坎,4 個進程在爭搶 1 個 CPU,每個進程等待 CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%胡嘿。這些超出 CPU 計算能力的進程蛉艾,最終導致 CPU 過載。

分析完這三個案例衷敌,我再來歸納一下平均負載與CPU

平均負載提供了一個快速查看系統(tǒng)整體性能的手段勿侯,反映了整體的負載情況。但只看平均負載本身缴罗,我們并不能直接發(fā)現(xiàn)助琐,到底是哪里出現(xiàn)了瓶頸。所以面氓,在理解平均負載時兵钮,也要注意:
平均負載高有可能是 CPU 密集型進程導致的;
平均負載高并不一定代表 CPU 使用率高侧但,還有可能是 I/O 更繁忙了矢空;
當發(fā)現(xiàn)負載高的時候,你可以使用 mpstat禀横、pidstat 等工具屁药,輔助分析負載的來源

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柏锄,隨后出現(xiàn)的幾起案子酿箭,更是在濱河造成了極大的恐慌,老刑警劉巖趾娃,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缭嫡,死亡現(xiàn)場離奇詭異,居然都是意外死亡抬闷,警方通過查閱死者的電腦和手機妇蛀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笤成,“玉大人评架,你說我怎么就攤上這事】挥荆” “怎么了纵诞?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長培遵。 經(jīng)常有香客問我浙芙,道長登刺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任嗡呼,我火速辦了婚禮纸俭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘南窗。我一直安慰自己掉蔬,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布矾瘾。 她就那樣靜靜地躺著,像睡著了一般箭启。 火紅的嫁衣襯著肌膚如雪壕翩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天傅寡,我揣著相機與錄音放妈,去河邊找鬼。 笑死荐操,一個胖子當著我的面吹牛芜抒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播托启,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼宅倒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屯耸?” 一聲冷哼從身側(cè)響起拐迁,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疗绣,沒想到半個月后线召,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡多矮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年缓淹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔逃。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡讯壶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出患雏,到底是詐尸還是另有隱情鹏溯,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布淹仑,位于F島的核電站丙挽,受9級特大地震影響肺孵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颜阐,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一平窘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凳怨,春花似錦瑰艘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至李剖,卻和暖如春芒率,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篙顺。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工偶芍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人德玫。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓匪蟀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宰僧。 傳聞我的和親對象是個殘疾皇子材彪,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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