Skip to main content

11 posts tagged with "Tool"

View All Tags

· One min read

刪除特定一行

sed '/^keywords:/d' input > output

刪除符合字串後的所有行數

sed '/^keywords/,$d' input > output

搭配 Find 達到大量修改所有檔案

統一刪除所有檔案

find . -type f -exec sed -i '' '/^authors:/d' {} +

Append 一行新的,換行要特別注意處理

find . -type f -exec sed -i '' '/^title/a\
authors: hwchiu\
' {} +

大量換名稱 https://hackmd.io/_uploads 變成 ./assets/

find *.md -type f -exec sed -i '' -e 's/https:\/\/hackmd\.io\/_uploads\//\.\/assets\//g' {} +

假設環境中有大量檔案需要改名稱,透過 rename 這個工具可以快速達成 譬如以下範例會先用正規表達式找尋所有符合的檔案名稱,接者將所有 read-notes 都改名為 reading-notes

rename 's/read-notes/reading-notes/' *read-notes-*

· One min read

修改 Author,可以 commit 時修改也可以事後修改

$ git commit -m "Test" --author "HungWei Chiu<[email protected]>"
$ git commit --amend --author "HungWei Chiu<[email protected]>" --no-edit

如果想要連 commit 一起修改且長期使用,比較簡單的方式就是直接設定 local user/email

$ git config --local user.email "[email protected]"
$ git config --local user.name "HungWei Chiu"

針對當前 commit 可以採用 --reset-author 的方式來修正

git commit  --amend --no-edit --reset-author

· 5 min read

本文主要嘗試分析 drbd(9.0) 於 kernel運行時的效能分析,希望藉由 perf 這個 tool 來分析整個程式運行的狀況,藉此觀察其運行時各 function 的比例。

Testing Environment

為了進行效能上的分析,首要條件就是先將 DRBD 給衝到效能瓶頸才有機會去觀察,所以本文採用下列的環境與工具來進行這項作業

Environment

CPU: Intel(R) Xeon(R) CPU E5-2695 v3 @ 2.30GHz Storage: Non-Volatile memory controller(NVME) Tool: fio OS: Ubuntu 16.04 with linux 4.4.0-78-generic

Setup

為了更方便觀察 drbd 的運行,我們將 drbd 創造的 kernel thread 都分別綁在不同的 cpu 上,這樣可以讓每隻 kernel thread 盡可能去使用cpu。

  1. 透過 ps or htop 取得 kernel thread 的 pid,這邊可以關注的有
    • drbd_s_r0 (sender)
    • drbd_r_r0 (receiver)
    • drbd_as_r0 (ack sender)
    • drbd_a_r0 (ack receiver)
    • drbd_w_r0 (worker)
  2. 透過 taskset 這個指令將上述程式分別綁到不同的 cpu 上
taskset -p 0x100 18888
...

Stress

本文使用 fio 來進行資料的讀取,下方提供一個簡易的 fio 設定檔,可依照自行的環境變換修改。

[global]
iodepth=512
numjobs=3
direct=1

time_based
runtime=30
group_reporting
size=5G
ioengine=libaio

filename=/mnt/beegfs/fio1.test
[rrw]
bs=4k
rw=randrw
rwmixread=75

[rr]
bs=4k
rw=randread

[rw]
bs=4k
rw=randwrite

[sr]
bs=64k
rw=read

[sw]
bs=64k
rw=write

我們 fio 採用 client/server 的架構,要是可支援多台 client 同時一起進行資料讀取,提供更高的壓力測試。

假設該設定檔名稱為 fio.cfg,並且放置於 /tmp/fio.cfg 則首先在 node-1 上面執行下列指令以再背景跑一個 fio server

fio -S &

接下來要運行的時候,執行下列指令來運行 fio,其中若想要改變測試的類型,可透過 --secion進行切換。

/fio --client=node-1 /tmp/fio.cfg --section=rw

這時候可以透過 htop 以及 iostat 的資訊去觀察,如下圖 當前透過 iostat 觀察到的確對 drbd0 有大量的讀寫動作 同時由 htop (記得開啟 kernel thread觀察功能),可以看到 drbd_s_r0 以及 drbd_a_r0 都各自吃掉一個 cpu,大概都快接近 100% 的使用率。

Profile

有了上述的環境後,我們就可以準備來分析 drbd 程式碼運行狀況。

Environemnt

這邊使用 perf 這套程式來分析,基本上 kernel 新一點的版本都已經內建此功能了,比較舊的 kernel 則需要自己重新開啟該 kernel config然後重新 build kernel,所以這邊使用 Ubuntu 16.04 with linux 4.4.0-78-generic 相對起來非常簡單。

直接執行 perf 這個指令,若系統上有缺少 linux-tools-4.4.0-78 相關 tool 的話會有文字提示你,如下所示,按照提示使用 apt-get 將相關的套件安裝完畢後,就可以使用 perf 了。

WARNING: perf not found for kernel 4.4.0.78

You may need to install the following packages for this specific kernel:
linux-tools-4.4.0-78-4.4.0-78
linux-cloud-tools-4.4.0-78-4.4.0-78
Run

perf 的功能非常強大,可以參考 wiki, 這邊我們使用 perf top 的方式來觀察結果。 為了可以順便觀看 call graph 的過程,再執行perf的時候要多下-g這個參數

指令為 perf top -g -p $PID,如 perf top -g -p 18888

在這邊我嘗試觀察 drbd_a 這隻,結果如下列

drbd_a

這邊可以觀察到三隻吃比較兇的 function 都吃很兇,分別是 native_queue_spin_lock_slowpathtr_release 以及 idr_get_next

這邊比較麻煩的是你看這個只能知道就是卡在 spin_locK,系統上是不是 multithread,然後有太多的資料要搬移導致 spin_lock ? 這些搬移的資料是誰放進去的?,這些資料是什麼?

以及更多的問題都必須要看程式碼去理解其整體設計架構,才有辦法講出一套完整的流程說明這個結果。

這部份等之後能夠完整理解整個 drbd 的 write-path 或是 read-path 時再重新來看一次這張圖,到時候應該會有完全不一樣的思維。

· 2 min read

不久前有一篇文章https://daniel.haxx.se/blog/2017/04/22/fewer-mallocs-in-curl/指出, curl 開發者嘗試將 malloc 呼叫的次數減少,結果對整體的影響帶來的顯著的提升

使用 curl http://localhost/512M 當作第一個比較 原始版本的 curl 關於 malloc 相關數據如下

Mallocs: 33901
Reallocs: 5
Callocs: 24
Strdups: 31
Wcsdups: 0
Frees: 33956
Allocations: 33961
Maximum allocated: 160385

而修改後的版本為

Mallocs: 69
Reallocs: 5
Callocs: 24
Strdups: 31
Wcsdups: 0
Frees: 124
Allocations: 129
Maximum allocated: 153247

比較起來可以發現, malloc 呼叫的次數有急遽的下降,從 33901 降落到 69,而整體使用的記憶體也少了 7KB 左右 此外,若比較兩者傳輸的速度,抓取一個 80GB 的檔案

Original: 2200MB/sec
Modified: 2900MB/sec

在傳輸方面提升了 30% 左右的速率,非常驚人 若使用 time 指令來比較新舊版本抓取 80G 檔案的差別

Old code:

real 0m36.705s
user 0m20.176s
sys 0m16.072s
New code:

real 0m29.032s
user 0m12.196s
sys 0m12.820s

修改相關的 commit 如下

簡單來說就是將 malloc 的部分都拔除,盡量使用 stack 來提供記憶體,藉此減少呼叫 malloc 的部分。 主要是因為 curl 在傳輸的過程中,會有非常大量且小空間的 malloc 被呼叫到,這部分拖慢的整體的運行速度

· 2 min read

Basic

  • commit所使用的編輯器會依照下列優先度去選擇,

    1. GIT_EDITOR 環境變數
    2. core.editor 的設定
    3. VISUAL 環境變數
    4. EDITOR 環境變數
    5. vi 指令
  • 變動檔案請用 git mv,使用git rm要注意檔案系統內的檔案會被真的刪除。

  • git log可以列出簡略的coommit資訊

  • git show [commit id] 可以看詳細的commit資訊,可以加上commit ID來指定特定的commit

  • git show-branch --more=10 可以看當前bracnh的詳細commit資訊,由--more控制數量

Configuraion

總共有三種設定方式,優先度如順序

  • .git/config, 可以用 --file或是預設的方式操作
  • ~/.gitconfig, 可以用 --global操作
  • /etc/gitconfig,可以用 --system操作
git config --global user.name "hwchiu" (2)
git config user.email "[email protected]" (1)
  • 可以透過 git config -l列出當前所有的設定
  • 可以透過 --unset來移除設定
git config --unset --global user.name

· 3 min read

本篇文章是用來記錄以前修課關於 Shell Script 的作業

Introduction

用Unix的指令,透過pipe的方式完成下列要求

  • 計算當前目錄底下資料夾的總數
  • 計算當前目錄底下檔案總數
    • 只有計算regular file.不考慮FIFO、LINK
  • 計算所有檔案大小和 (Byte)
  • 顯示前五大的檔案名稱
  • 只能使用PIPE,不能使用 $$ ; || & > >> <

Implement

  • 使用ls來取得所有資料夾跟檔案的資訊
    • -l 可以顯示詳細資訊,這邊我們要取得的是 檔案大小
    • -R 遞迴的往每個資料夾繼續往下找
    • -A 不要把...給顯示出來,因為這種當前目錄的東西我們不需要
  • 使用sort來幫忙排序,找出檔案大小前五個
    • -r 排序結果反過來,由大到小排序
    • -n 排序的時候,採用數字的方式去排序,不使用字母大小去排序
    • -k 指定第幾個欄位要排序
  • 使用awk作最後的處理,找出前五大,印出所有檔案大小和
    • 因為再ls -l的結果中,會有很多資訊,包含 ./cs/.svn/pristine/74: 或者 total 28,所以awk再處理的時候,先用NF判斷該行的欄位數,至少要有9個欄位才處理 if(NF>=9)
    • 接下來針對檔案是資料夾還是檔案,做全部的計數,可以由 -rw-r--r-- 的第一個欄位來決定,如果是d就代表資料夾,否則就是檔案。 這邊我使用 regular expression來判斷 ($1 ~/^d/)? (dir=dir+1) : (file=file+1)(size=size+$5),此外如果是檔案得話,就順便把大小也計算一下
    • 執行過程中,因為剛剛已經排序過了,所以 前六行都把大小印出來, if(NR<6) print NR": "$5" "$9}
    • 最後就把所有資訊都列印出來

ls -RlA | sort -rnk 5 | awk '{ if(NF>=9) ($1 ~/^d/)? (dir=dir+1) : (file=file+1)(size=size+$5); if(NR<6) print NR": "$5" "$9} END{ print "Dir = "dir"\n" " File = " file"\n" "total = "size}'

· 3 min read

最近重新整理vim的設定檔,意外的發現 http://yoursachet.com/ 這個網站滿好用的,可以根據你的需求來自動打造vim設定檔,對於不想動腦去研究設定檔而言的人來說是滿好用的工具 用滑鼠輕鬆點點就可以產生堪用的VIM了!!

vimrc 設定

set encoding=utf-8
set fileencodings=ucs-bom,utf-8,big5,latin1
set fileencoding=utf-8
set termencoding=utf-8
set number " 行號
set statusline=%<\ %n:%f\ %m%r%y%=%-35.(line:\ %l\ of\ %L,\ col:\ %c%V\ (%P)%)
set ai " 自動縮排
syntax on " 色彩標示

set tabstop=4 " tab使用四個空白取代
set shiftwidth=4 " 縮排空白數,要搭配set cin使用
set cin
set cursorline " 該行的線
set t_Co=256 " 支援 256 色
set textwidth=0
set backspace=2 "按下backspace會後退,道行首後會刪除到前一行
set showmatch "顯示括號配對情況
set nocompatible "用vim的特性去運行,捨棄vi的特性

" Pathogen
call pathogen#infect()
call pathogen#helptags()

filetype plugin indent on

" Nerdtree
autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p
let NERDTreeShowBookmarks=1
let NERDTreeChDirMode=0
let NERDTreeQuitOnOpen=0
let NERDTreeMouseMode=2
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\.pyc','\~$','\.swo$','\.swp$','\.git','\.hg','\.svn','\.bzr']
let NERDTreeKeepTreeInNewTab=1
let g:nerdtree_tabs_open_on_gui_startup=0


set background=dark "背景顏色
colorscheme wombat
nnoremap <silent> <F5> :NERDTree<CR>
"normal mode的時候+數字 可以切換tab
nnoremap <Esc>1 gt1
nnoremap <Esc>2 gt2
nnoremap <Esc>3 gt3
nnoremap <Esc>4 gt4
nnoremap <Esc>5 gt5
nnoremap <Esc>6 gt6
nnoremap <Esc>7 gt7
nnoremap <Esc>8 gt8

NERDTree

更改呼叫方式,使用F5

nnoremap <silent> <F5> :NERDTree<CR>

在各界面中移動

  • 按照順序往下移動 (crtl+w+w)
  • 上一個view (ctrl+w+h)
  • 下一個view (ctrl+w+l)

切割視窗

  • 水平切割 (在該檔案前按i)
  • 垂直切割 (在該檔案前按s) i :水平 s :垂直

tab使用

  • 開新tab並且切換過去 (t)
  • 開新tab但不切換過去 (T)
  • 下一個tab (gt)
  • 上一個tab (gT)

· 2 min read

Introducion

Cscope 是一個用來trace code還滿方便的工具 我通常都用他來trace linuxe kernel code,雖然說有網頁版的reference可以使用,但是用起來不順手,網頁會卡卡的 因此還是習慣使用這種互動式的trace tools

Install

sudo apt-get install cscope on Ubuntu

portmaster devel/cscope on FreeBSd

Usage

詳細的可以參考man page. 通常我只有使用 -R 來觀看而已

第一次執行的時候,會花比較久的時間去建立一個cscope.out的檔案,會把一些相關資訊放進去

下次執行的時候就會利用該out檔案來作查詢。

其他

預設的情況下,cscope只能讀取

  • .c
  • .h
  • .l
  • .y

想要讓他讀取java或是cpp的專案,就必須要先自己建置該資料庫

  • find ./ -name *.cpp > cscope.files
  • fine ./ -name *.java >> cscope.files
  • cscope -bkq

前面兩行會把所有的檔案路徑都寫入倒cscope.files裡面

  • b:建立索引文件
  • k:建立索引文件時不會去搜尋/usr/local/目錄
  • q:生成cscope.out,加速索引,該檔案包含
    • locate functions
    • function calls
    • macros
    • variables
    • preprocessor symbols

接下來只要使用cscope就可以了

· One min read

文章轉移

  • rsync cycbuff
  • rsync db/history
  • 重新建立overview
    • ctlinnd pause 'make overview'
    • makehistory -x -O -b x: won't write out history file entries. O: Create the overview database b: Delete any messages found in the spool that do not have valid Message-ID: headers in them.
    • makedbz -i i:To ignore the old database
    • ctlinnd go 'over'

設定檔檢查

  1. inncheck (inn.conf)
  2. scanspool -v (active, spool)

更新相關設定

  • 重新編譯innd,進入innd src底下
  • ./configure --opetions
  • make && make update

創新的newsgroup

  • ctlinnd newgroup name
  • modity db/newsgroup

其他

  1. 創新newsgorup
  1. 執行innd & nnrpd 會噴權限不足
    • 檢查/news/bin/innbind 有無SUID

· 2 min read

Install

直接透過atp-get 安裝即可

sudo apt-get install sphinx

Config

安裝完畢後,執行

sphinx-quickstart就可以基本設定了

每個選項都有說明,基本上都採用預設值即可

  • 設定檔: conf.py

    • 外掛管理
    • 資料夾結構管理
    • 一些通用參數,如作者名稱,版本...等
  • 主要的檔案: index.rst -. 檔案的結構 -. toctree

index.rsta

Lab Meetgins
=============
.. toctree::
:maxdepth: 4
:titlesonly:

20130924.rst
20131001.rst

國科會 meetings
===============
.. toctree::
:maxdepth: 4
:titlesonly:

20130925.rst

這邊我定義兩個toctree,每個toctree底下又會有其他的rst,結構大概是這樣

  • Lab Meetings
    • 20130924.rst
    • 20131001.rst
  • 國科會 meetings
    • 20130925.rst

總共兩個分類,每個分類底下的文章都是一個額外的rst檔案

在toctree底下的都是一些設定參數

  • maxdepth : 最大深度
  • titlesonly : 在首頁面只顯示子類的標題

Write

Sphinx採用的reStructuredText 格式跟markdown很類似,但是複雜了一些 官方網站有滿詳細的介紹,有需要時再去參考即可

Build

如果想要轉成html網頁,有兩種方法可以執行

  1. sphinx-build -b html . NSLMeeting 意思是建置html的網頁, 然後以當前目錄為source 來源,然後把檔案build到NSLMetting去。

  2. make html 在Makefile中定義了相關得動作,當執行make html的時候,其實就是執行 sphinx-build -b html . _build/html

這邊因為我想要直接弄到別的資料夾,所以我直接設定aliase去執行方法1

目前對於這套軟體還在學習階段,有任何學習會繼續紀錄。