Linux進程管理、作業及相關工具

Linux進程管理原理

Linux的進程管理,就是對硬件各資源進行分配、調度、銷毀等工作,其主要部件的管理為:CPU、內存、IO的分配和調度工作。其CPU的指令執行又分為特權指令、普通指令級別,而在linux系統層面將其對應為內核空間、用戶空間。系統運行之上的程序通常只能執行普通指令,如果需要管理硬件,與硬件相關的讀、寫、刪除操作(即面向硬件層面的請求),需要向init進程提交請求,再由Init進程發送給內核,由內核調用CPU完成其指令,這個過程被稱作為系統調用,也被稱為軟中斷。而系統調用在用戶空間的表現形式為各種函數,即程序內部代碼調用了其對應的函數模塊。從用戶模式切換到內核模式,或者從內核模式到用戶模式,這個過程就稱之為模式切換。當發起一個系統調用,通常被稱之為一個軟中斷. 當IO或者其他的硬件完成操作,需要將其結果發送給CPU處理時,CPU此時將暫停其他工作,接手其IO的中斷請求,這過程被稱之為硬中斷.
CPU是將其計算能力劃分為以時間為單位的時間片,再將時間片發配給進程使用,以此來完成程序的響應。由于各進程會搶用時間片,以造成其他進程不能正常工作的情況,此時將由內核管理進程的運行狀態、優先級、進程的生命周期等工作,此過程被稱之為進程調度。當計算機只有一顆物理CPU時,意味著正在運行的情況只能有一個,多任務處理的情況會面臨搶占資源。故需要將多個等待處理的進程狀態保存至內存中,Linux內核存儲進程的結構體被稱之為task struct,每個task struct都保存了其進程名,存儲位置,進程的優先級等信息,多任務的task struct存儲被稱之為鏈表結構(task list),即內核把物理內存分成大小為4k的頁框,再將頁框分配給進程的虛擬內存(vritual size,虛擬內存集),讓每個進程都工作在虛擬內存集中,從虛擬層面感知自己可用空間為系統的剩余空間。當系統啟用時會加載很多的基本庫glic或者其他的程序所共同依賴的庫文件,都會一次性加載到內存中,這部分被稱之為共享內存集(shared size),如果每個內存將使用共享內存中的庫文件,會在自己的虛擬內存中添加其所需的文件內存地址指針.而不是把所需要的文件都加載到其進程空間中。
共享內存集又被分為常駐內存和不常駐內存,常駐內存一般是系統調用所需要的庫文件,故是不能被交換到交換分區的。當內存負荷比較大的情況下,內核會通過LRU算法將不常用的內存空間交換到交換分區,如果需要重新使用此進程時,內核又會將其調入到內存中加載被使用。
內存管理中,每個進程又被分優先級。內核將進程劃分為280個隊列,其中140個隊列存放過期隊列(被調度過的進程),140個隊列存放運行的進程,當下次調用進程的時候,只需要掃描140個運行的進程隊列首部即可,以此完成快速調用。其每個隊列有其對應的優先級,表示范圍為『0-139』。「0-99」是實時優先級,數值越大,優先級越大。「100-139」是靜態優先級,其中可通過管理命令調整,使用nice值表示為-20,19,并對應100-139的優先級。其nice值越小表示優先級越高。越高優先級的進程會被優先調用執行。當一個進程正在運行時,此時一個高的優先級進程需要先執行,CPU將暫停正在運行的進程,將CPU的運行狀態保存至寄存器,這個過程稱之為保存現場。這種進程與進程之間的切換,也被稱之為上下文切換。
內存存放數據格式
  • 堆(heap)
    • 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收
  • 棧(stack)
    • 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等
  • 代碼段
  • 數據段
進程間通信機制IPC (inter process communication):
  • socket
  • D-bus(用于桌面程序和OS通信)
  • Dcop(輕量級的,功能較少,一般用于K桌面環境)
  • SOAP(用于web服務,使用http其傳輸協議)
  • XML-RPC(用于web服務,使用http其傳輸協議)
  • CORBA(面積對象編程中復雜的IPC解決方案)
進程的類型
  • 守護進程:daemon(服務類),在系統引導過程中啟動的進程,跟終端無關
  • 前臺進程:跟終端相關,通過終端啟動的進程
進程的狀態及其就對的代碼
  • 運行態:running,正在運行的
    • R:running
  • 就緒態:ready,等待運行的
  • 睡眠態:
    • 可中斷的睡眠:interruptable
      • S : interruptable-sleeping
    • 不可中斷的睡眠 :uninterruptable(其有IO等待)
      • D :uninterruptable-sleeping
  • 停止態:stopped,暫停于內存中,但不會被調度執行,除非手動啟動
    • T : stopped
  • 僵死態:zombile,僵尸進程
    • Z : 僵死態
進程標識符代碼:
  • + : 前臺進程,運行在終端之上,需占用prompt
  • l : 多線程進程
  • N : 低優先級
  • < : 高優先級
  • s : session leader, 可以理解為會話的父進程
查看內核中進程的相關信息
  • /proc/PID
  • /proc/PID/maps : 進程存放內存映射的位置
進程IO調用的過程:
  • 先將數據由內核加載到內核空間,
  • 再將內核空間的數據復制一份到進程空間
Centos各版本的守護進程
  • Centos 5
    • Sys init --> 依賴腳本串行啟動,比較慢
  • Centos 6
    • Sys init --> upstart啟動程序,依賴于ubus機制通信,并行啟動各進程
  • Centos 7
    • Systemd --> systemd啟動程序,只需要一個init進程,就可以把各服務啟動起來,啟動速度快

=========

Linux下進程管理各工具

ps命令
工作原理:
  • 通過/proc輸出狀態信息。/proc/PID的目錄下,存放了當前進程的各種信息

ps命令

ps - ps - report a snapshot of the current processes.
  • synopsis: ps [options]
    • [options]
      • 其有三種風格使用方法:
            1 UNIX options, which may be grouped and must be preceded by a dash. 
            2 BSD options, which may be grouped and must not be used with a dash. 
            3 GNU long options, which are preceded by two dashes.

* `a` : 所有與終端相關的進程
* `x` : 所有與終端無關的進程
* `u` : 以用戶為中心來組織狀態信息顯示,其是以PID進行排序
* `-e` : 顯示所有進程
* `-f` : 顯示完整格式的進程信息
* `-F` : 顯示完整格式
* `-H` : 以層級結構顯示進程的相關信息
* `o` : 自定義要顯示的字段列表,以逗號分隔
    * ps axo pid,cmommand
常用組合:
  • ps aux
      [root@zhenping 1]# ps aux
      USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root          1  0.0  0.7  59632  7676 ?        Ss   21:06   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
    
  • ps -ef
      [root@zhenping 1]# ps -ef
      UID         PID   PPID  C STIME TTY          TIME CMD
      root          1      0  0 21:06 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
    
  • ps -eFH
      root@zhenping 1]# ps -eFH
      UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
      root          2      0  0     0     0   0 21:06 ?        00:00:00 [kthreadd]
    
  • ps -eo
      [root@zhenping 1]# ps -eo pid,command,user
      PID COMMAND                     USER
    
  • ps axo
      root@zhenping 1]# ps axo pid,command,user,nice
      PID COMMAND                     USER      NI
    
ps中常用的命令字段
  • pid
  • nice
  • pri:優先級
  • psr:進程當前分配的處理器
  • pcup:占用CPU百分比
  • stat:進程狀態
  • command:運行的程序
  • tty:終端
  • ppid:父進程
  • rtprio :realtime priority,實時優先級
ps命令顯示中的字段名稱含義
  • %CPU : 占用CPU的百分比
  • %MEM : 占用內存的百分比
  • VSZ : virtual size,虛擬內存集(線性內存空間存數據占用的大小)
  • RSS : resident size,常駐內存集,不能放到交換內存上,有的時候也會顯示為RSZ(rsszie.resident set size)
  • STAT : 進程的運行狀態
  • time : 進程占用CPU的累計時間
  • USER : 用戶

pgrep命令

功能
  • 進程過濾,以實現快遞查找進程
pgrep - pgrep, pkill - look up or signal processes based on name and other attributes
  • synopsis: pgrep [options] pattern

  • [options]

    • -u UID : 顯示指定用戶的進程

    • -U UID : read user,由誰啟動的進程

    • -t Terminal : 與指定的終端相關的進程

    • -l : 顯示進程名

    • -a : 顯示完整格式的進程名,進程名和啟動的參數

    • -p PIDNUM : 顯示此進程的子進程

        pgerp ssh : 查看進程中有ssh的字符串的進程
        pgrep sshd | xargs -i kill -9 {}  #將所有sshd進程退出
        pgrep sshd | xargs kill -9 #同上
      

pkill命令

  • 用法與pgerp相同

pidof命令

  • 取指定進程的進程號

      pidof sshd   # 顯示sshd的進程號
      2215 1041
    

top命令

top - display Linux processes
top中顯示名稱含義解釋
  • 第一行(uptime信息,可以使用l命令關閉或顯示)

      系統的當前時間、運行時長、登錄用戶、平均負載(過去1分鐘、5分鐘、15分鐘的平均負載,指每邏輯CPU進程隊列長度)
    
  • 第二行(進程任務)

  • 第三行 : (CPU使用情況,可以使用t命令關閉或顯示)

    • us : 用戶空間
    • sy : 內核空間(一般負載的CPU,us與sy所點的比例為7:3)
    • ni : nice
    • id : 空閑百分比
    • wa : 等待IO完成的時間
    • hi : 硬件中斷消耗CPU百分比
    • si : 軟件中斷消耗CPU百分比
    • st : 被偷走的百分比,一般指虛擬機
    • cs : 上下文切換
  • 第四行(內存使用信息,可以使用m命令關閉或顯示)

    • 總空間
    • 空閑空間
    • 已使用空間
    • 緩沖和緩存的空間(可以被回收再使用,不逄真的占用)
      • 真正的系統空間應為:free + buff/cache
  • 常用字段說明
  • VIRT : 虛擬內存集

  • RES : 常駐內存集

  • SHR : 共享內存集

  • 常用命令
  • M : 以內存占用率排序

  • P : 以CPU占用率排序

  • T : 以累計占用CPU時間排序

  • q : 退出top工具

  • k : 終端指定的進程

  • s : 更改top的刷新時間,默認為3秒

  • u : 只顯示指定用戶的進程

  • top啟動參數
  • -d # : 啟動時指定刷新時間間隔,默認為3秒

  • -b : 以批次方式顯示

  • -n # : 顯示多少批次

htop命令
  • [options]

    • -d # : 指定刷新時間的時間間隔
    • -u USERNAME :僅顯示指定用戶的進程
    • -s COLUME : 以指定字段進程排序
  • 內置命令

    • s : 顯示進程的系統調用
    • l : 顯示選定的進程打開的文件列表
    • t : 以層級關系顯示各進程的狀態
    • a : 選定進程綁定在指定的CPU上

=========

Linux性能查看工具

vmstat命令
vmstat - Report virtual memory statistics
  • synopsis: vmstat [options] [delay [count]]

      vmstat 2 : 每兩秒鐘顯示一次
      vmstat 2 3 : 每兩秒鐘顯示一次,顯示3次
    
  • [options]

    • -s : 顯示內存各種統計數據
各種選項字段說明
  • procs

    • r : 處于等待運行的進程個數,即每CPU上等待運行的任務長度,實時的,不是其平均值
    • b : 阻塞的任務隊列長度,處于不可中斷睡眠態的進程個數,如果這個值太大,說明IO太大
  • memory

    • swpd : 交換內存的使用問題,0表示沒有啟動交換內存,如果使用量太大,說明服務器內存太小了
    • free : 空閑的物理內存總量
    • buff : 用于buffer的內存總量
    • cache : 用于cache的內存總量
  • swap

    • si : 平均值,數據進入swap中的數據速率(kb/s)
    • so : 平均值,數據離開swap中的數據速率(kb/s)
      • 注意:si so的活動頻繁,速率大,交換內存也使用了,并且有增大的趨勢,說明物理機的內存太小了
  • io

    • bi : 從塊設備讀入數據到內存的速率(kb/s)
    • bo : 從內存到塊設備的速率(kb/s)
  • system

    • in : interrups(中斷),中斷速率,數值太大了,說明CPU太弱
    • cs : context switch ,上下文切換速率,數值太大了,說明CPU太弱
  • CPU

    • us:用戶空間占用的百分比
    • sy:內核空間
    • id: idle,空閑的
    • wa: wait,等待IO完成的
    • st: stolen,被偷走的時間
dstat命令:
dstat - versatile tool for generating system resource statistics
  • dstat [-afv] [options..] [delay [count]]

    • [options]
      • -c: 查看CPU
      • -C #,#..,total :查看指定CPU或總的CPU
      • -d :disk的相關信息
      • -D sda,sdb….total :磁盤信息
      • -g : 顯示Page相關的統計數率數據
      • -i : 中斷
      • -m : mem
      • -n ;interface的相關統計數據
      • -p : process的相關統計數據
      • -r : IO請求相關統計數據
      • -s : swapped相關統計數據
      • -t : 輸出當前時間
      • —-aio : 異步同步信息
      • —-rpc
      • —-lock : 文件鎖的信息
      • —-raw : 祼套接字的信息
      • -—tcp :查看tcp連接信息
      • -—udp:
      • —-raw
      • —-socket
      • —-ipc
      • —-top-io: 顯示最占用io的進程
      • —-top-cpu: 最占用cpu的進程
      • —-top-int :最大中斷的進程
      • —-top-mem:最占用內存的進程
      • —-top-latency: 延遲最大的進程
iostat
iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions
  • [options]
    • -d : 顯示磁盤設備

    • -k : 以block為單位顯示的列強制使用K為單位

    • -x : 顯示其擴展信息

        iostat -x 1 10 : 顯示擴展信息,以1秒刷新間隔,顯示10次
        Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
        sda               0.06     0.05    1.07    0.28    12.36     5.81    26.90     0.00    0.91    0.70    1.71   0.74   0.10
        
        說明:
            rsec/s:每秒讀取的扇區數;
            wsec/:每秒寫入的扇區數。
            avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好
            await:  每一個IO請求的處理的平均時間(單位是微秒毫秒)。這里可以理解為IO的響應時間,一般地                     系統IO響應時間應該低于5ms,如果大于10ms就比較大了。這個時間包括了隊列時間和服務時                       間,也就是說,一般情況下,await大于svctm,它們的差值越小,則說明隊列時間越短,反之                      差值越大,隊列時間越長,說明系統出了問題。
            svctm    表示平均每次設備I/O操作的服務時間(以毫秒為單位)。如果svctm的值與await很接近,表                        示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高于svctm的值,則表示I/O隊列等待太                       長,系統上運行的應用程序將變慢。
            %util: 在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該設備有0.8秒在                        處理IO,而0.2秒閑置,那么該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙                        程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即                      使%util是100%,因為磁盤的并發能力,所以磁盤使用未必就到了瓶頸)。
      
pmap命令
功能:
  • 查看進程內存映射表
synopsis: pmap [option] PID [...]
  • [option]
    • -x : 顯示詳細格式的信息

        pmap -x 1 #顯示Pid為1的內存映射表詳細信息
        pma 1 #顯示PID為1的內存映射表信息
      
注意:可以 cat /proc/1/maps,也可以查看進程的內存使用情況
glances 命令
  • 跨平臺的監控工具,其監控計算機的性能信息,可以理解為遠程版本的top工具
內建命令
  • b : 以Byte為單位顯示網卡數據速率

  • d : 關閉磁盤IO模塊

  • m : 關閉mount模塊

  • n : 關閉network模塊

  • t # : 刷新時間間隔

  • 1 : 每個CPU的統計數據單獨顯示

  • -o {html | csv} : 以指定格式輸出

  • -f /path/DIR : 設定輸出文件的位置

      glances -o HTML -f /root/ : 指定以html格式輸出到root目錄下
    
glances的C/S模式
  • 服務端:

      glances -s -B IPADDR # ipaddr指本機的某地址,用于監聽,-s表示為服務端,-B表示指定哪個IP地址
    
  • 客戶端:

      glances -c IPADDR # -c表示為一個client,IPADDR為服務端的IP地址
    
kill命令
kill - kill - terminate a process
  • synosis: kill -l
    • 信號標識方法有三種:
      • 信號的數字標識
      • 信號的完整名稱
      • 信號的簡寫名稱
  • synopsis: kill [-s signal|-p] [-q sigval] [-a] [--] pid...
常用信號
    1. SIGHUP:無須關閉進程而讓其重新讀取配置文件
    1. SIGINT: interrupts之義,終止正在運行的進程
  • 9)SIGKILL : 殺死運行中的進程(直接退出)

  • 15)SIGTERM : 終止正在運行的進程(讓其保存好數據再退出)

  • 18)SIGCONT : 繼續

  • 19)SIGTOP : 停止

      kill -1 2219 # 讓此進程重讀配置文件
      kill -sigkill 2219 
    
調整進程優先級
  • 可通過nice命令調整進程的優先級,優先級的范圍為100-139,分別對應 -20,19的閥值,進程啟動時nice值為0,其對應的優先級為120,nice數值越小優先級越高
nice命令
nice - run a program with modified scheduling priority
nice [option] [COMMAND][ARGU….]
  • [options]
    • -n NICE : 指定nice值

        nice -n -5 htop #為115優先級啟動htop
        
        注意:nice值只有管理員可調
      
renic命令
renice - alter priority of running processes
renice [-n] NICE PID
  • [options]
    • -n NICE : 指定NICE值

        renice -n -3 5207 : 調整進程PID為5207的nice值為-3 
      

================

Linux上的作業控制

作業的分類
  • 前臺作業(foregroud)
    • 通過終端啟動,且啟動后會一直占據終端
  • 后臺作業(backgroud)
    • 可以通過終端啟動,但啟動后立即轉入后臺運行
如果將作業運行于后臺
  • ctrl + z
    • 此方法會將作業轉為停止狀態
  • COMMAND &
    • 此類作業立即送到后臺,也會有終端相關,如果終端停止了,作業也會被停止
  • nohup COMMAND &
    • 此類作業立即送到后臺,脫離終端
顯示當前系統上的所有作業
jobs 命令
    root@zhenping ~]# jobs
    [1]-  已停止               vim a.sh
    [2]+  已停止               ping 202.96.209.5
將作業從后臺調回到前臺
  • fg 命令
    • fg [[%]] JOB_NUM]]
      • %:表示這是一個作業號

      • JOB_NUM : 作業號碼

          fg 1 # 把1號作業調回到前臺
        
將后臺作業從停止狀態變成運行狀態
  • bg命令
    • bg [[%]] JOB_NUM]]

        [root@zhenping ~]# bg 3  #3號作業從停止轉運行狀態
        [3]+ ping 202.69.209.5 &
      
結束作業
  • kill命令
    • kill %job_NUM

        [root@zhenping ~]# kill %2 #結束2號作業
      
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容

  • 又來到了一個老生常談的問題,應用層軟件開發的程序員要不要了解和深入學習操作系統呢? 今天就這個問題開始,來談談操...
    tangsl閱讀 4,143評論 0 23
  • 進程相關概念 內核的功能 進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等。 process 進程,正...
    夾克K閱讀 1,023評論 0 1
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,191評論 2 33
  • 一個程序被加載到內存當中運行,那么在內存內的那個數據就被稱為進程(process)。進程是操作系統上非常重要的概念...
    Zhang21閱讀 1,976評論 0 12
  • 芥藍想必大家都不認識吧,芥藍的營養價值高嗎?什么是芥藍呢?芥藍的功效與作用有哪些呢?經常食用芥藍有助于我們的腸胃蠕...
    你的夏天閱讀 490評論 0 0