Linux的cpu/power自動省電工具

剛好在Hacker News 上看到,記錄一下,也許以後會用得到。

有人分享了一個開源的cpu/電源自動化管理工具(auto-cpufreg),讓Linux的筆電的cpu可以電池模式下降件cpu的負載,而在插電模式下,又可以自動的提高cpu的運算能力。

如果有人有Linux的筆電,剛好也可以試試。

Reference:

常用指令 – awk

awk 是個很強大的工具, 透過其特製的語法可以在很多變化上處理pipe或檔案內容;之前一段時間不碰後,又忘了之前使用過awk語法,趁最近又開始接觸來重新複習這個工具。

測試用檔案 – log.txt

假設一個log檔的檔名為log.txt,且內容如下:

2 this is a test 
3 Are you like awk 
This's a test
10 There are orange,apple,mongo

基本搭配print做格式化輸出

NOTE:

  • 值得注意的是,$0awk中代表的是整行文字
# 在print使用逗號,可以在輸出時用空白隔開$1與$4
awk '{print $1,$4}' log.txt

(上述指令針對每一行的log,截取第1個與第4個讀取到的文字)

2 a
3 like
This's
10 orange,apple,mongo

透過-F 更改分割字元

由於預設awk是使用空白當分割字元來處理同一行文字的,若要改變分割字元,則可以使用-F 這個flag。

aws -F , '{print $1,$2}' log.txt

(上述指令針對每一行的log,透過,分隔以後,截取分割後的第1個與第2個讀取到的文字)

2 a
3 like
This's
10 orange apple

(以這個log檔來看,只有最後一行才會被分割成多個arguments)

透過-v 來代入自訂的變數

透過預先定義好的變數

awk -v a=1 -v b=2 '{print $1,$1+a,b}' log.txt

(上述指令定義了a, b 2個變數與值,且在print時使用它們)

2 3 2
3 4 2
This's 1 2
10 11 2

透過運算符號來使用awk

支援的運算符號可以參考這裡

對每一行文字,過濾只有第一個參數大於2
awk '$1>2' log.txt

# output
3 Are you like awk
This's a test
10 There are orange,apple,mongo
對每一行文字,過濾只有第一個參數大於2,且第二個參數必須是"Are"
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt

# output
3 Are you
對每一行文字,列出只有字元數大於20的行
awk 'length>20 {print $0}' log.txt

# output
10 There are orange,apple,mongo

搭配Regular expression使用

awk中,可以透過運算符號~!~來去搭配正規表示法使用。

對於每一行文字,當第一組參數不是數字時才會被print出來
awk '$1 !~ /[0-9]/ {print $0}' log.txt

# output
This's a test

對於每一行文字,只有當第一組參數是數字時才會被print
awk '$1 ~ /[0-9]/ {print $0}' log.txt

# output
2 this is a test
3 Are you like awk
10 There are orange,apple,mongo

對於每一行文字,只有符合正規表示法時才會被print

如果只是要對整行文字作匹配的話,則可以直接用這方式

awk '/re/ ' log.txt

#output
3 Are you like awk
10 There are orange,apple,mongo

或加個!來過濾掉匹配到的每一行文字

awk '!/re/ ' log.txt

#output
2 this is a test
This's a test

搭配awk的進階使用

awk常見可以使用的keyword可以參考這裡

過濾掉第一行的文字(通常可用於csv檔拿掉header)
awk 'NR != 1' log.txt

# output
3 Are you like awk
This's a test
10 There are orange,apple,mongo

(我猜NR指的應該是Nnumb of Row)

對文字檔的特定參數做數字加總,並且print出來
awk '{sum+=$1} END {print sum}' log.txt

# output
15

(如果每一行的第一個參數是數字的話,就會對它做加總並暫存在sum這個變數上)

針對文字檔中的每一行,來做分組與處理

假設我們有個文字檔如下,然後我們想要針對每個Category的值串起來在印出來

Category: OS
Windows
Liux
Unix
Category: CPU
x86
arm64
amd64
Category: RAM
1GB
2GB
4GB
8GB
16GB

awk '/Category/ {header=$0; if (v) print v; v=""; next} { v=(!v) ? header"="$0 : v","$0;} END {print v;}' support_sepcs.txt

# output
Category: OS=Windows,Liux,Unix
Category: CPU=x86,arm64,amd64
Category: RAM=1GB,2GB,4GB,8GB,16GB

這個指令用了到幾個進階的功能:

  • /Category/ 用來匹配當遇到Category那一行的文字時,會在{header=$0 ...;next}中處理。(結尾的next是指說跳過後面的{v=(!v)…}相關的工作)
  • () ? : 用三元運算符號來去給v這個變數值。
  • END 用來處理最後的收尾。
  • 整個指令的邏輯是,當如果遇到文字中含Category時,則那行的文字會當作是接下去的header,然後如果v 目前是有值的情況下,則print v
    (這個情況v會是前面的字串組成的結果, 例如處理Category: CPU時,v這時會有值,且值會是Category: OS=Windows,Liux,Unix)。
    若沒遇到Category的話,則繼續append 目前的這一行文字到v這個變數上。
    最後一個Category: RAM則是透過 END { print v}來去print出來。
  • 如果在header後想要多處理else的話,會是這樣的語法:
    {header=$0; {if (v) { print v; v=""; next } else {v="";next}}

總結

整個awk的進階使用還更複雜,尤其是它支援許多語法,透過它的語法可以寫成另一個awk的script了,然後在指令中讀取來使用,像是awk -f cal.awk log.txt

reference

常用指令 – xargs

基本上常搭配其它linux指令 (find, awk, sed, grep…)一起使用,主要是因為一些linux的指令是沒直接支援pipe,所以可以透過xargs將前面pipe的輸出當成input arguments 給下一個指令使用;

xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔

將find的結果,透過xargs 來當作grep 主要要找的對象

find . -name "*.go" -print | xargs grep "src"

-0 flag

-0 flag主要是用來讓xargs 來讓可以去處理需要escape的字元,像是空白字元…

-n flag

-n flag 是用來指定每隔多少個要切割成一個pipe的arguments,也就是目前的pipe經過xargs以後會產生N/n 個pipe(N為目前pipe的argument數量)。如果沒有設定的話預設為把所有xargs 當下截取到的內容全部收集到目前這個pipe中。

舉例來說,一個env檔的內容如下:

FOO=123
BAR=456
LOCAL=127.0.0.1
PORT=3000

如果我們沒加-nflag時,用下面的指令:

cat env| xargs

則輸出結果會是 (env檔中的4個環境變數會被當成目前這個pipe的argument)

FOO=123 BAR=456 LOCAL=127.0.0.1 PORT=3000

但如果指令改成是下面這樣時

cat env| xargs -n 2

則輸出結果會是 (env檔的4個環境變數被切割成每2個是一組argument, 並且丟到下一個pipe中,所以這樣就fanout成2個pipe了)

FOO=123 BAR=456
LOCAL=127.0.0.1 PORT=3000

-I flag

-I 主要是可以用來將截取到的內容,暫存成一個變數名稱,來方便下個指令使用。

以下面的例子來說,會將所有找到的 *.conf檔案,透過xargs暫存到變數{}中,所以接下來的ls -al {}就可以這樣用…

find /etc/ -name "*.conf" | xargs -I{} ls -al {}

另個例子則是像是備份所有的.conf檔,則可以透過-I flag

find /etc/ -name "*.conf" | xargs -I{} cp {} {}.bk

integrate with bash

更彈性的用法是,它可以直接當作bash的輸入arguments;若一樣以前面的env 檔來當例子,透過以下指令我們可以透過一個簡短的bash來處理其中的第3個($2)環境變數。

cat env| xargs bash -c 'export $2'

Reference:

使用sshuttle來連接不同環境下的機器

最近由於專案快上線了,所以頻繁的連接在不同的環境下的機器,或是監看機器的使用狀態;在這樣的使用情境下,之前有試著使用Socks5 + SwitchyOmega 的組合來連接,這樣的組合在只用來連接內網的dashboard時是蠻堪用的,但如果其它類型的連線就無法了。

每當要使用像是TCP連線到內網的機器(像是連資料庫之類的),就都要在先連一次VPN,然後才再連線;但連線完VPN以後,又要把SwitchyOmega的設定關閉,不然VPN +Socks5 + SwitchyOmega 的組合無法讓我連到特定的Dashboard…
這其實蠻惱人的,尤其是頻繁的切換使用VPN網路時,或是在開會過程中,又需要連到特定環境下的機器…

通常這問題大概可以使用幾種方式克服:

VPN – Partial Routing

若是使用OpenVPN的話可以在導入Profile時加入以下設定來讓client端可以自訂路由的規則。

route-nopull
route X.X.Y.Z 255.255.255.255

這邊的範例是只有往x.x.y.z 時才會經由vpn。

但這個方案的缺點是,同時間也只能連到一台OpenVPN 伺服器,所以代表同時間也只能連到同一個環境下的機器。

但優點就是所有TCP/UDP的封包都可以經由路由連接到那個環境下的機器。

SSH Tunnel Proxy

其實ssh 已經提供了一個方便的解決方案了,即是使用-L 這個flag,讓我們可以透過中介的jump/proxy server,讓我們的本地主機與遠端主機建立一個虛擬通道。

ssh -NL 5432:staging-postgres.your-domain.com user@jumper-server.your-domain.com

(使用-f 可以讓這個tunnel 在背景下執行。)

透過上面的指令,我們就可以執行下面的psql 指令來連接staging postgres這個資料庫。

psql -U postgres -d postgres -h 127.0.0.1 -p 5432

這個方案的缺點就是,如果有多台主機需要連的話,可能要設定多個Tunnel Proxy。

sshuttle

在Stackoverflow 上剛好看到了這篇文章,其中回應有提到了sshuttle 這個開源的專案可以透過ssh tunnel導流所有TCP的流量到遠端的jump server,也就是類似TCP Proxy的功能。

試了以後還蠻方便的,它底層的原理即是使用了ssh tunnel proxy,所以也是需要一台中介的ssh jump/proxy server。除此之外,它可以讓使用者用根據網段來轉送流量,所以基本可以解決原本在ssh tunnel proxy的一些不方便之處。

安裝

# For Mac
brew install sshuttle

# For ubuntu
sudo apt-get install sshuttle

使用上的基本指令

sshuttle -vr user@jumper-server.your-domain.com 10.0.0.0/8

上面這指令即是把所有往10.0.0.0/8的TCP流量都自動轉往jumper-server.your-domain.com上送…

Reference:

Linux 的log 機制

會有這篇文章,主要還是因為在工作上踩了好幾次坑,很多次都遇到了log檔佔用了太多的硬碟空間,所以趁這機會好好研究一下linux上相關的設定。

在Linux上Distro,Log 相關的 daemon主要有以下幾個:
(1) rsyslogd
(2) systemd-journald
(3) logrotate.d
而它們各自有不同的工作要處理,下面就分別來介紹每個daemon service:

rsyslogd

 rsyslogd is the enhancement of syslogd, a service that takes care of managing centralized log files. Syslogd has been around for a long time.

https://www.golinuxcloud.com/systemd-journald-how-logging-works-rhel-7/

rsyslogd 算是syslogd的進化版本,相對於syslogd, 它提供更有效率的log 處理方式

預設的log 會寫入到/var/log/syslog 裡,而相關的設定檔則是放在/etc/rsyslog.conf/etc/rsyslog.d/50-default.conf裡面。

在ubuntu20.04中,rsyslog.conf 的設定來看,它預設是從imuxsock裡讀取到log 訊息,並寫入到/var/log/syslog之中。相關在rsyslog.conf的設定如下:

module(load="imuxsock") # provides support for local system logging

另外,在ubuntu中,是使用systemctl來執行這個daemon,所以我們可以透過下面這個指令來看其執行狀態:

sudo systemctl status rsyslog.service

而相關的輸出大概會是長這樣:

● rsyslog.service - System Logging Service
      Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
      Active: active (running) since Thu 2021-08-26 11:12:02 UTC; 1 weeks 1 days ago
 TriggeredBy: ● syslog.socket
        Docs: man:rsyslogd(8)
              https://www.rsyslog.com/doc/
    Main PID: 269574 (rsyslogd)
       Tasks: 4 (limit: 9369)
      Memory: 517.1M
      CGroup: /system.slice/rsyslog.service
              └─269574 /usr/sbin/rsyslogd -n -iNONE

簡單講,rsyslogd 主要就是負責系統所有相關的log的寫入,像是/var/log/syslog, /var/log/auth.log, /var/log/kern.log
不過對於log 寫入之外的工作,就不是由它來負責的了,而是由另一個服務logrotate來負責的。

更改設定檔以後,則要使用sudo systemctl restart rsyslog.service來重啟服務以讀取新的設定檔

logrotate

從名稱上就可以看得出,這個service主要負責的工作就是做log file的rotate,所以當我們發現/var/log/syslog的檔案過大時,很大一部分的原因會是我們沒有設定好 /var/log/syslog的rotate設定。

logrotate 的設定檔位置在/etc/logrotate.conf,裡面有定義了預設的log檔案rotate設定;而針對於不同log的rotate 客制化設定,則是放在/etc/logrotate.d/ 這個資料夾下面。

舉例來說,是rsyslog的log rotate 設定的位置就是在/etc/logrotate.d/rsyslog 這裡。而相關的範例設定如下:

/var/log/syslog
 {
     rotate 7
     hourly
     maxsize 100M
     missingok
     notifempty
     delaycompress
     compress
     postrotate
         /usr/lib/rsyslog/rsyslog-rotate
     endscript
 }
 /var/log/mail.info
 /var/log/mail.warn
 /var/log/mail.err
 /var/log/mail.log
 /var/log/daemon.log
 /var/log/kern.log
 /var/log/auth.log
 /var/log/user.log
 /var/log/lpr.log
 /var/log/cron.log
 /var/log/debug
 /var/log/messages
 {
     rotate 4
     weekly
     missingok
     notifempty
     compress
     delaycompress
     sharedscripts
     postrotate
         /usr/lib/rsyslog/rsyslog-rotate
     endscript
 }

NOTE:
如果rotate的timesize都有設定的話,那就會以size為基準。而目前設定檔time最多只能支援到hourly
不過如果是以size為基準的話,應該也可以設定每分鐘的cron job,定期執行logrotate

另外,與一般的system service不一樣的地方是,logrotate是透過cron job的方式執行的,它的基本運作方式是,當我們執行了下面的指令去讀取新的rotate設定時

sudo logrotate /etc/logrotate.conf

logrotate 這個程式除了會去執行對應的rotate工作外,還會根據設定去產生對應的cron jobs。
舉例來說,如果我們設定syslog的rotate檢查頻率為hourly,那我們就可以找到對應的/etc/cron.hourly/logrotate 的cron job。

更改設定檔以後,則要使用sudo logrotate /etc/logrotate.conf來重啟服務以讀取新的設定檔

systemd-journald

 With the introduction of systemd, the journald log service systemd-journald has been introduced also. This service is tightly integrated with systemd, which allows administrators to read detailed information from the journal while monitoring service status using the systemctl status command.

https://www.golinuxcloud.com/systemd-journald-how-logging-works-rhel-7/

journald 是近年來在Linux上常被預設啟用的另一個log deamon service,它主要與systemd services 作整合,而與rsyslogd不同之處可以參考這裡:

Journald provides structure and indexed log files (called journals) in a secure manner. Therefore, not only are the journal files easier to search, it is harder for system intruders to cover their tracks.. Also you can maintain rsyslog messages in structured format.

Another advantage of using the systemd-journald service over traditional logging daemons is that journal files are automatically rotated if they grow above certain limits. This reduces log file maintenance issues and complexity.

The journalctl utility is used to read the journal binary log files and this command provides several means of filtering the data which is very powerful.

https://www.golinuxcloud.com/systemd-journald-how-logging-works-rhel-7/

簡單來說,它可以看成是rsyslogd的加強版,除了提供更安全的log儲存方式外,還額外提供了log rotate的功能,另外其搭配的cli journalctl還可以方便使用者檢索需要的log內容。

基本上journald的儲存相關設定主要是分為runtimesystem:

  • runtime: 所以runtime 相關的journals 會存放在/run/log/journal/下,一旦重新開機以後,舊的journals是不會保留的。
  • system: 如果下面的路徑/var/log/journal 存在且有對應的權限時,那麼journald就不會去寫log到/run/log/journal/底下了,而是持續性的寫入到/var/log/journal/下,在這情況下,即使重開機以後,舊的journals還是會保留的。

在ubuntu20.04中,journald的log 存放位置是在/var/log/journal,而設定檔的位置則是在/etc/systemd/journald.conf。 相關的設定檔說明可以參考ubuntu這文章

journald預設是透過systemd service的方式啟用的,所以透過下面的指令可以看得出目前journald的運作狀況:

sudo systemctl status systemd-journald.service

範例輸出結果為:

● systemd-journald.service - Journal Service
      Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled)
      Active: active (running) since Wed 2021-07-28 09:56:47 UTC; 1 months 7 days ago
 TriggeredBy: ● systemd-journald-dev-log.socket
              ● systemd-journald-audit.socket
              ● systemd-journald.socket
        Docs: man:systemd-journald.service(8)
              man:journald.conf(5)
    Main PID: 186 (systemd-journal)
      Status: "Processing requests…"
       Tasks: 1 (limit: 9369)
      Memory: 39.4M
      CGroup: /system.slice/systemd-journald.service
              └─186 /lib/systemd/systemd-journald
 Warning: journal has been rotated since unit was started, output may be incomplete.

journalctl 指令的使用

通常主要是透過journalctl指令來讀取log與變更log檔的一些設定,一些透過journalctl過濾/讀取log的相關技巧可以參考這邊

而一些常用journal 相關的管理指令如下:

  • 顯示目前所有journal的在硬碟上的使用空間
journalctl --disk-usage

  • 一次性的限制所有journal可以使用的硬碟空間 (e.g. 1GB),另外在清理時只會針對被archived 過的journal作清理。
sudo journalctl --vacuum-size=1G

更多journald 與rsyslog的整合與比較可以參考這裡

相關設定以確保log 檔案不會過大

在了解rsyslog, logroatejournald的一些運作模式以後,接下來回到之前常遇到的問題,log檔案size過大,而導致系統運作不正常的這個問題。

由於ubuntu20.04預設是同時會執行rsyslogdjournald的,所以基本上我們要關注的log檔案有兩個位置,分別是/var/log/syslog/var/log/journal

syslog的相關設定

基本上,針對sysloglogrotate預設是每天會做一次rotate,所以為了避免我們的應用程式在短時間製造過多的log,我們可以修改/etc/logrotate.d/rsyslog如下:

sudo vim /etc/logrotate.d/rsyslog

接著修改設定檔中的/var/log/syslog 部分如下

/var/log/syslog
 {
     rotate 3
     hourly
     maxsize 100M
     missingok
     notifempty
     delaycompress
     compress
     postrotate
         /usr/lib/rsyslog/rsyslog-rotate
     endscript
 }

以這樣來限制syslog的檔案大小

journald

以ubuntu20.04為例,它預設就是寫入到/var/log/journal,也就是說,我們必須去設定/etc/systemd/journald.conf 中的System*相關參數,詳細設定如下:

SystemMaxUse=1G
SystemKeepFree=
SystemMaxFileSize=100M
SystemMaxFiles=10

清除過大的log檔案

SYSLOG

如果目前的syslog 真的長的太大了,且裡面的內容是可丟棄的情況下,則可以使用下面的指令來清空目前的/var/log/syslog

#  this command needs to be ran as root
> /var/log/syslog

JOURNAL

如果是journal的話,則可以先將目前的journal archived,再做清理,詳細指令如下:

sudo journalctl --rotate
sudo journalctl --vacuum-time=1s

其它相關的清理方式可以參考這裡

reference:

Asahi Linux for M1 Mac

這個Asahi Linux專案主要是想要讓M1 版本的MACs可以執行Linux,所以之後如果有相關的需求時,感覺可以來這看看是否可以用。

目前的進度來看,離正常使用應該還有段距離,希望這些類似的專案都能成功;可以想象如果可以有一台執行Linux的筆電,並且同時有M1的高效與不秏電,這個應該是許多開發者都希望有的一台電腦呀XDDD

Reference

Socks5 proxy server的設定

今天跟DK開會時,他利用些片段時間分享了他的工作環境設定,主要是關於他怎麼透過設定他的環境來同時可以連接dev, stage, production的環境。
會有這個分享主要也是因為我們在切換環境時,相對較笨拙點,都是透過連接不同的vpn server來切換到不同的環境下,但同時也只能在同時間點,只能連接到某個環境。

那就來進入主題了,他分享的方式,主要是透過在本機端建立socks5 proxy server, 將對於特定目標位址的流量,proxy到遠端預先設定好的jump server,再到對應的最終目標位址。

Step 1. 建立遠端的jump server

只要遠端的server有開啟ssh server的,就已經可以當成jump server了,而我們的stag jump server 就是這樣設定的。

Step 2. 設定 ~/.ssh/config (optional)

為了更容易的連接jump server,而不用每次都打一大串的ssh 指令,我們可以把連接jump server的相關設定寫到 ~/.ssh/config下,範例如下:

Host staging_jumper
   HostName our-jump-server.com
   IdentityFile ~/.ssh/jump-server.key
   User my-username

Step 3. 在本機端啟動socks5 server

由於剛剛在上一步有設定好連接jump server時,需要的ssh user 與 key,所以這邊可以很簡單的用下面的ssh指令啟動socks5 server

ssh -D 1081 -C -N -f staging_jumper

-D 1080 代表要將連往本機端 port 1081的流量轉送到staging_jumper上。
-f 代表要在背景執行
-C 代表要壓縮資料
-N 代表不執行任何遠端指令,通常做port forwarding 都會代入這flag

如果要關閉在背景的socks5 server,則可以用ps -aux 找出剛啟用的socks5 server pid,接著再使用kill指令去停掉正在運行的sock5 server process。

Step 4. 檢查是否有socks5 server是否有運作正常

curl --socks5 localhost:1081 http://your-staging-service.com

可以簡單透過curl 指令,來發起一個http的request到我們剛啟用的socks5 server port上。 如果成功的話,理論上會看到我們預期的html 網頁了。

Step 5. 設定SwitchyOmega

這是一個browser extension,主要是可以讓我們連接不同的網頁時,可以使用預先設定好的條件或方式來連接。
舉例來說,我們可以設定當接http://192.168.10.2:8080這個位址時,就自動透過我們預先設定好的socks5 server 與jump server 連接,此外,它還可以透過wildcard的方式來導流特定網段或特定domain 的網頁。

如以下範例

當我們啟用本機端的socks5 server以後,就可以到下面的SwitchyOmega頁面去設定代理伺服器。

之後,只需要再設定auto switch來決定哪些目標網頁要使用哪些代理伺服器就完成了

reference:

TCP BBR

最近聽到DK提到TCP BBR這個名詞時,才知道原來它是一種新的TCP 機制,主要可以提高在網路不穩定下的TCP傳輸品質。
當下聽了覺得蠻神奇的,後來去查了以後才發現,這技術已經發表有幾年了,現在才知道真的有點感到汗顏阿0rz…

TCP BBR

TCP BBR 全名為 TCP Bottleneck Bandwidth and Round-trip propagation time,是Google 在2017年所發現的TCP 擁塞控制演算法,適用於在網路不可靠的環境下,可以有效的提升傳輸效率。

而Google他們那時也宣稱,在他們導入Youtube以後,整個infra的網路傳輸效率平均提升了4%以上。

而相關的演算法原理可以參考這裡,基本上就是控制TCP資料的傳送端,透過演算法來控制更適合的傳輸速率,進而到讓傳輸的資料速率可以到達目前傳送與接收端之間的實際最大值,也因為這樣子,所以在真實不穩定的網路下,它可以更好的讓資料傳輸量不會過大而造成網路擁塞…

設定TCP BBR

目前只要Linux Kernel 的版本大於4.9以上,就可以直接透過更改sysctl的方式來啟用目前主機上的TCP BBR,詳細的設定如下:

透過以下的設定來確定目前的tcp 擁塞演算法:

sysctl net.ipv4.tcp_available_congestion_control

在還未設定使用bbr之前,通常應該會顯示cubic

接著加入以下的設定到/etc/sysctl.conf

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

最後執行以下指令來套用bbr的設定

sudo sysctl -p

理論上,這時候再次用下面的指令時,目前的TCP 設定時,應該就會是bbr

sysctl net.ipv4.tcp_available_congestion_control

一些注意事項

由於TCP BBR的運作模式是主動地計算目前兩端點之前的傳輸頻寬,然後用最佳的方式去想辦法灌滿這段連線,所以從上面模式看來,要啟用的TCP BBR的機器最好是傳送資料端,這樣每次傳送時就會使用這套演算法來強化傳輸效率了。

當然,如果兩端的機器都可以啟用的話,那就沒這個問題了…

何時該套用TCP BBR呢

TCP BBR也不是萬能的,它為了提高在網路不穩定的情況下的傳輸效率,但同時也會在一些情況下,表現不如預期;這篇文章描述了一系列的情境來說明,何時套用TCP BBR會得到更好的傳輸效率。

Reference:

透過ps與top的來找出秏費系統資源的程式

pstop都是linux 開機即有的基礎指令,最近才發現它們也可以幫我們依照消秏資源的程度來呈現目前使用率最大的程式。

ps 指令

找出前10個較秏cpu 資源的程式

-eo : 是用來指定輸出目前process 的特定欄位,並且在透過 --sort (linux)或 -r/-m (darwin)來進行排序。

linux:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu

darwin:

ps -eo pid,ppid,%mem,%cpu,comm -r | head

找出前10個較秏memory 資源的程式

linux:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem

darwin:

ps -eo pid,ppid,%mem,%cpu,comm -m | head

top 指令

top 主要是透過互動式的terminal 介面來呈現目前系統的狀態,但其它也可以透過輸出模式的變更來做到與ps 指定相似的結果。
如果需要更fancy的系統狀態儀表板的話,其實可以另外安裝htop試試…

linux :

-b 代表不使用互動界面的方式出輸結果。
-o 代表用特定欄位排序

top -b -o +%MEM | head -n 10

darwin:

-stats 用來顯示輸出的欄位
-o 代表用來排序的欄位
-l 用來控制要採樣的次數,1 代表只輸出一次結果。
-n 用來控制呈現的前n

top -stats pid,cpu,mem,th,pstate,time,command -o MEM -n 10 -l 1

reference:

https://shutdown2110.blogspot.com/2018/07/linux-ps-top-cpu.html

https://www.freebsd.org/cgi/man.cgi?ps(1)

https://unix.stackexchange.com/questions/88613/how-is-it-possible-to-sort-ps-commands-cpu-field

https://superuser.com/questions/538957/print-top-output-only-once-on-mac-os-x

dmesg的使用 (linux 開機資訊)

不知道有沒有人跟我一樣,常常有些linux的指令都是用過就忘了,每次有需要debug時,又需要再查一次之前linux是怎麼樣使用 0rz

幾次下來以後,還是乖乖把一些常用的debug指令大概列一下如何使用,這樣之後查會快一些吧XDDDD

dmesg 這個指令主要是用來顯示一些開機後的一些訊息,例如像是一些RAM的資訊、網路資訊、硬體資訊、partition 等等…

NOTE:
這個指令會需要用到 sudo的權限…

顯示最近一次的開機資訊

sudo dmesg

顯示最近一次開機時的記憶體資訊

sudo dmesg | grep -i Memory

輸出的範例就會像是:

[    0.208540] kernel: Memory: 61491092K/62810216K available (14339K kernel code, 2536K rwdata, 8848K rodata, 2648K init, 4908K bss, 1319124K reserved, 0K cma-reserved)

清除dmesg的內容

sudo dmesg -c

完整的dmesg log

有時候dmesg會只顯示部分的內容,所以我們想要找的資訊可能會在開機很久後而不會顯示在dmesg 的輸出結果;所以如果要看完整的dmesg內容的話,也可以直接到下面兩個log檔去找:

  • /var/log/kern.log
  • /var/log/dmesg