透過jq 將json檔案格式輸出成 env格式

剛好工作上有這個需求, 就順便找了一下看 jq 指令是否可以簡單的做到這件事…

測試了下面的指令以後, 看起來真的是頗好用, 一行指令就可以把 json 轉成 env 了!

cat example.json| jq -r 'to_entries[] | [.key,.value] | join("=")' > example.env

Reference:

Linux中網路界面速度的調整方式

最近剛好工作上有需要, 需要針對一些網路情況不佳的裝置去做一些實驗; 但問題來了, 要在實務上去真的找到這種裝置其實蠻難的, 這時候Linux 提供了一些很好模擬的方式來對特定的網路界面模擬上述情境…

限制網路界面的速率

再做了一些快速的瀏覽以後, 看起來在Linux中主要是透過 tc 這個指令來做 traffic control, 不過社群中有人提供了一個更簡便的方式 wondershaper, 如果OS是ubuntu 的話可以用 sudo apt-get install wondershaper 就可以安裝了.

一些常見的指令範例有:

設定eth1 的download=256kbps, upload=128kbps

sudo wondershaper eth1 256 128

清除 eth1的流量設定

sudo wondershaper clear eth1

設定網路界面的packet lost 機率

這個情境下, 我們可以模擬網路掉包在不同嚴重程度的情況下的情境; 主要是透過 iptables 來達成, 可以參考以下範例:

設定來源ip為 123.123.123.123 且封包到這台電腦的 local port為 3000時, 其packet drop的機率為 5%

sudo iptables -I INPUT -s 123.123.123.123 -p tcp --dport 3000 -m statistic --mode random --probability 0.05 -j ACCEPT

reference:

Ubuntu 中調整輸出音訊的方式

最近接了藍芽喇叭以後, 發現ubuntu 內建的system settings 在選擇輸出音訊時有時候會不太正常, 常常聲音會出不來, 或是在先前所選的裝置。

後來查了stackoverflow上的一篇文章後, 發現了一個不錯的工具…. pavucontrol

安裝 pavucontrol

sudo apt install pavucontrol
pavucontrol 

然後執行 pavucontrol 以後就有一個新的音訊控制的UI了 XD

Reference

Linux的cpu/power自動省電工具

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

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

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

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:

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