hayashier Tech Blogs
  • hayashier Tech Blogs
  • Author's Books
    • 実践Redis入門 (日本語版)
    • 実践Redis入門 (한국어판)
  • Top Contents
    • Dive Deep Redis
    • Dive Deep Memcached
    • Kubernetes 入門
    • TCP 入門
    • TLS 入門
    • GPG 入門
    • サービス障害が発生した場合の対応方法
    • よく使うトラブルシューティング コマンド実行例 まとめ
    • コピペで使えるELBのアクセスログ解析による事象分析 (ShellScript, Athena)
  • Containers
    • Docker 入門
    • Nomad 導入
    • Dockerを利用してさっと検証環境構築
  • Kubernetes
    • Kubernetes 入門
    • Kubernetes 導入 with Amazon Linux 2
    • EKSを利用してKubernetesでSpring MVCをデプロイ (NLB + Auto Scaling)
  • Load Balancer
    • ALB 認証 導入
    • TLS extensions support with ALB
    • ELB(CLB,ALB,NLB)の種類ごとのHTTPレスポンスの違い
    • ELB(CLB) で WebSocket 通信
  • RDBMS
    • PostgreSQL DBA 入門
    • RDBMS Benchmark Get Started
    • RDBMS サンプルデータ生成 Get Started
    • RDS PostgreSQL Extensions Get Started
    • RDBMS Engine Inspection for Troubleshooting
  • Redis
    • Dive Deep Redis ~ 入門から実装の確認まで
    • Dive Deep Redis Internals ~ GETコマンド実行時の動作 ~
    • RedisのString型は今でも本当に512MBが上限か?
    • Redis 公式ドキュメント まとめ
    • Redis / Memcached Source Code Reading - Overview -
  • Memcached
    • Dive Deep Memcached ~ 入門から実装の確認まで ~
    • Dive Deep Memcached ~ SETコマンド実行時の動作 ~
    • Memcached 公式ドキュメント まとめ
    • memtier_benchmark + memcached-tool の導入
    • Redis / Memcached Source Code Reading - Overview -
  • Hadoop
    • Hadoop Get Started
  • Networking
    • TCP 入門
    • TLS 入門
    • ksnctf: HTTPS is secure, Writeup (TLS 通信解読)
    • オンプレ側ルーター(Cisco 1812J, Juniper SRX210, YAMAHA RTX 1210)から Direct Connect へ BGP 設定
  • Software
    • アルゴリズムとデータ構造 入門
    • デザインパターン 入門
    • ソフトウェアテスト 入門
  • System Admin
    • Shell Script 入門
    • サービス障害が発生した場合の対応方法
    • よく使うトラブルシューティング コマンド実行例 まとめ
    • コピペで使えるELBのアクセスログ解析による事象分析 (ShellScript, Athena)
    • GPG 入門
    • Operation Misc
  • Development
    • ローカル環境のプログラミング言語のバージョンを切り替え macOS
    • /usr/local/Cellar/pyenv/1.2.21/libexec/pyenv: No such file or directoryのエラーの対処方法
  • AWS
    • AWS Misc
    • AWS CLI, AWS SDKのリトライ処理の実装について
    • AWS CLI バージョンアップでエラー発生を解消
    • Elastic Beanstalkで稼働しているアプリケーション(Ruby, Sinatra)をAmazon Linux AMIからAmazon Linux2へ移行
    • Elastic Beanstalkでインスタンス入れ替え後にnginxのデフォルトの画面が表示されてしまう問題の対応
    • Amazon Lightsail に SSL 証明書設置 with Let's Encrypt (自動更新)
    • Amazon Lightsailで10分で作るお手軽Markdownで書く独自ドメインのブログサイト構築
    • Lambdaをローカルでテスト(with Docker)
    • ECS + ALB でダウンタイムなしでデプロイ
    • `Repository packages-microsoft-com-prod is listed more than once in the configuration`のメッセージの解消方法
  • Others
    • Pandoc 導入
    • textlint + prh による文章校正
    • 紙書籍をPDFに変換
    • Sphinx 導入
    • さくっとPocketのブックマークをはてなブックマークに移行
    • Macが突然起動しなくなった話
    • Macでターミナルが開かない (zsh編)
    • ホスト型 IDS Tripwire とネットワーク型 IDS Snort の導入 with CentOS 6
    • JMeter 導入
    • Squid 導入 with Amazon Linux AMI
    • Spring MVCを導入 (+ MySQL, Redis)
    • 外資系企業で働いている場合の確定申告方法 (RSU考慮)
Powered by GitBook
On this page
  • ファイル
  • /proc/
  • プロセス
  • バージョン
  • ls系
  • dmidecode
  • パフォーマンス
  • 監査
  • auditd
  • ネットワーク
  • General
  • 接続性
  • コマンド別
  • Others
  • 低レイヤー
  • strace
  • gdb
  • 負荷テスト
  • パケットキャプチャ 
  • Wireshark
  • カーネルソースコード入手
  • Yumレポジトリ中のrpmの中のJavaを確認
  • screen
  • ディスク容量いっぱい
  • 不要ファイルの洗い出し
  • yumのキャッシュを確認
  • BPF
  • その他
  • Unix時間を変換
  • 10進数へ変換
  • ALBで502生成
  • macOS
  • ターミナル
  • VSCode
  • 参考資料
  • Linux コマンド例 まとめ
  • 参照
  1. System Admin

よく使うトラブルシューティング コマンド実行例 まとめ

ファイル

  • ファイル名検索

$ find ./ -name hoge
  • 任意のファイルから特定文字列を検索

$ grep -r hoge ./
  • ファイルサイズが大きい順に表示

$ du -sh * | sort -h -r
  • 1秒おきにコマンド継続実行

$ while true; do sleep 1; echo hello; done
  • ディスク使用量確認

$ sudo ionice -c 2 -n 7 nice -n 19 du -scm /* | sort -rn
  • パーティション毎のディスク使用量確認

$ df -Th
  • メモリ使用量

$ free -m
  • Swapサイズ

$ swapon -s

/proc/

  • CPU情報、コア数など

$ less /proc/cpuinfo
  • メモリ使用内訳

$ less /proc/meminfo
  • OS内で動作するすべてのプロセスにおけるinotify watch数を把握

$ ls -l /proc/*/fd/ | grep inotify | wc -l

プロセス

  • プロセス数を確認

$ ps auxww
  • 使ってるファイルのプロセスを調べる

$ lsof -p PID番号
  • /bin/shで動いてるプロセスを全て停止する

$ pkill -f /bin/sh
$ ps auxww | grep /bin/sh | awk '{print $2}' | xargs kill

バージョン

  • OSバージョン

$ cat /etc/redhat-release
  • kernelバージョンを調べる

$ uname -a
  • パッケージの確認

$ rpm -qa
  • プロセスが掴んでいるファイル一覧

$ sudo ls -l /proc/2676/fd
  • プロセス内のスレッドの数

$ ps aux -L
  • 稼動しているプロセスを検索

$ pgrep -l syslog
  • プロセスの親子関係

$ pstree

ls系

  • PCI バスとそこにつながっているデバイス

$ lspci
  • CPUの情報

$ lscpu
  • ブロックデバイスのリスト

$ lsblk
  • ロードされているカーネルモジュール

$ lsmod

dmidecode

  • システムの情報、型番等

$ dmidecode -t system
  • BIOS の情報

$ dmidecode -t bios
  • CPU の情報

$ dmidecode -t processor
  • メモリの情報

$ dmidecode -t memory

パフォーマンス

  • References

    • Linux Performance

監査

auditd

/etc/audit/rules.d/audit.rulesファイルの末尾に、以下の行を追加しOSを再起動

-a entry,always -F arch=b64 -S kill -k MyKillTrace 

以後、/var/log/audit/audit.log にkillシステムコールを呼び出したプロセスの情報が記録される。以下のようにコマンドで対象のプロセスが発行したkillシステムコールをログに出力。

# strace -fttvo ログファイル名 -s 1000 -e kill -p プロセスID

ネットワーク

General

  • CPU使用率

$ vmstat 5
$ sar -p 5
  • 特定のユーザーが使用しているCPU使用率

$ top -u oracle
  • CPU使用率 Top15

$ top -H -b -n1 | head -15
  • ディスクI/O使用率

$ vmstat -d

接続性

  • traceroute

$ sudo traceroute -T -p 443 192.168.0.1
  • Nping

$ sudo nping 192.168.0.1 --tcp -p 443 -c 30
  • MTR

$ mtr --report -c 100 --no-dns github.com

コマンド別

netstat

  • TCPの接続状態確認

$ netstat -lanpt
  • LISTEN/ESTABLISHEDの状態(Openな接続)確認

$ netstat -an
  • ネットワークに正常にパケットが送受信できているか

$ netstat -i
  • 接続元のユニークなIP IPv4

$ netstat -nA inet | awk '/^[ut]/{split($5,a,:);print a[1]}'|sort |uniq -c |sort -n > ip-2.txt

IPv6

$ netstat -nA inet6 | awk '{print $5}' | sed s/::ffff:// | cut -d: -f1 | sort | uniq -c | sort -n > ip6-2.txt

ss

  • オープンな接続数の調査

$ ss -a | wc -l
  • TCPのみフィルタリング

$ ss -t | wc -l
  • TCPの状態でフィルタリング

$ ss state time-wait | wc -l

curl

  • ヘッダーだけ表示

$ curl -v -s www.google.com > /dev/null
$ curl -v -so /dev/null www.google.com
  • ヘッダー指定

$ curl -v -s -H Host: www.google.com clb.test.hayashier.com > /dev/null
  • 時間測定

$ curl -s -o /dev/null -w %{time_total} http://www.google.com
  • 詳細時間表示

$ curl -w %{remote_ip} time_namelookup: %{time_namelookup} tcp: %{time_connect} ssl:%{time_appconnect} start_transfer:%{time_starttransfer} total:%{time_total}\n -sk -o /dev/null http://www.google.com
  • POSTメソッド

$ curl --request POST 'http://www.google.com' --data hoge=fuga

動画ファイルのPOST

$ curl -v -F video=@Downloads/test.mp4 -X POST http://test.hayashier.com
  • Cookie 送信

$ curl -v --cookie HOGE=FUGA http://clb.test.hayashier.com
  • ラウンドロビンDNSの調査

$ curl -IsSv <FQDN> 2>&1 | grep Trying
  • レスポンスコード調査し続ける

$ IsError=false; while [ $IsError != true ]; do curl -I -k <URL> 2>&1 | tee error.out | grep HTTP/1.1  ; done;

スリープ付き

$ IsError=false; while [ $IsError != true ]; do sleep .5; (time curl -I -k <URL>) 2>&1; done;
  • 連続でリクエスト送信時のステータスコードと処理時間

$ while true; do curl -s -o /dev/null -w HTTPCode=%{http_code} TotalTime=%{time_total}\n http://www.google.com; done
  • 5秒おきにリクエスト送信時のヘッダー情報

$ while true; do curl -I -L http://www.google.com/; sleep 5; done
  • HTTP/2でテスト

$ curl --http2 -I https://twitter.com
  • スクリプトと合わせてテスト

$ curl -v -H 'TEST: '$(perl -e 'print 0x16376') http://test.hayashier.com
  • 表示項目 カスタマイズ 以下の内容を curl-format.txt として保存。

\n
Timing:\n
DNS Resolution Time:  %{time_namelookup}\n
TCP Handshake:    %{time_connect}\n
SSL Handshake:    %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect:    %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
---------------------------------------------\n
Total Time spent: %{time_total}\n
\n
HTTP Details:\n
HTTP Status Code: %{http_code}\n
Request Size:   %{size_request}\n
\n
$ curl -w '@curl-format.txt' -L https://google.com -so /dev/null


Timing:
DNS Resolution Time:  0.030453
TCP Handshake:    0.044017
SSL Handshake:    0.087345
time_pretransfer: 0.087440
time_redirect:    1.848814
time_starttransfer: 0.331126
---------------------------------------------
Total Time spent: 3.383122

HTTP Details:
HTTP Status Code: 200
Request Size:   152
  • ネームサーバ 接続テスト

$ while true; do curl --connect-timeout 5 -o /dev/null -Ssk -H Host: api.github.com https://192.30.255.116/ && echo ok; sleep 1; done

dig

  • ELBノード毎のレスポンスのHTTPステータス

$ dig +short +noall +answer alb.test.hayashier.com | xargs -L 1 curl -vG 2>&1 >/dev/null | awk '/^(< HTTP|> Host)/ { print $3 }'
  • ネームサーバ IP 列挙

$ for j in `dig +short  ns github.com.`; do dig @$j +short api.github.com.; done

OpenSSL

  • 接続テスト

$ openssl s_client -connect clb.test.hayashier.com:443

GET / HTTP/1.1
  • 証明書詳細

$ openssl s_client -showcerts -connect <host>:<port> < /dev/null
  • 暗号スイート指定

$ openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect clb.test.hayashier.com:443 

Netcat

  • クライアント/サーバ間通信

$ nc -v -l -k 1234
Connection from 127.0.0.1 port 1234 [tcp/search-agent] accepted
Hi
World

Connection from 127.0.0.1 port 1234 [tcp/search-agent] accepted
GET / HTTP/1.1
Host: localhost:1234
User-Agent: curl/7.51.0
Accept: */*

Connection from 127.0.0.1 port 1234 [tcp/search-agent] accepted
POST / HTTP/1.1
Host: localhost:1234
User-Agent: curl/7.51.0
Accept: */*
Content-Length: 9
Content-Type: application/x-www-form-urlencoded

hoge=fuga
$ nc localhost 1234 -v
Connection to localhost 1234 port [tcp/search-agent] succeeded!
Hi
World
  • 接続状態監視

$ while true ; do echo -n $(date): ; nc -vz api.github.com 443; sleep 2; done
  • 時刻変換

$ date --date='@1527718243'
Thu May 31 07:10:43 JST 2018

Others

  • nicolaka/netshoot

低レイヤー

strace

  • ps auxで対象プロセスのPIDよりプロセスIDを確認して、-pオプションで指定して動きをトレース

    • 例えば、Nginxのworkerのネットワーク関連にシステムコールの動きをトレースする場合は以下のように実行

      $ sudo strace -p 5 -e trace=network
    • 問題発生時に書くシステムコールで要した時間を確認したい場合は、以下のように実行

      • -e trace=xxxxで指定した

      • -ttでusecでタイムスタンプを絶対時間で表示

      • -Tで各システムコールで要した時間

      • -o FILE_NAMEで結果を指定したファイルに出力

        $ sudo strace -T -tt -e trace=all -p 460 -o output.txt

gdb

  • 実行プロセスのコードを追う

    $ gdb -p `ps aux | grep redis-server | grep -v grep | awk '{print $2}'`
  • Tips

    • ブレークポイントを打つ点は、btコマンドでデバッグトレースを確認し、毎回通過する関数などを観察すると良い(Redisの場合は、processCommand)。

※Redisサーバーをデバッグするためには、手動でビルドする必要があります。その際、make CFLAGS="-g "のように実行しておく必要があります。適宜MakefileのOPTIMIZATION?の値で-O2から-O0に変更しておくとよいでしょう。

  • References

    • Dive Deep Redis Internals ~ GETコマンド実行時の動作 ~

負荷テスト

$ h2load -n 10000 -c 10 -m 10 -v -p h2c https://test.hayashier.com
$ ab -n 10000 -c 10 -k https://test.hayashier.com
  • sysbench インストール

$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench

実行方法

$ sysbench --test=cpu run

パケットキャプチャ 

  • 取得

$ sudo tcpdump -w sample.pcap
  • フィルター例

sample.pcapというpcapファイルを読み込み(-rオプション)、DNSに変換せずに(-nオプション)、srcかdstのホストIPがxxx.xxx.xxx.xxxかつTCPポート80番

$ tcpdump -r sample.pcap host xxx.xxx.xxx.xxx and tcp port 80 -n

sample.pcapというpcapファイルを読み込み(-rオプション)、DNSに変換せずに(-nオプション)、srcのホストIPがxxx.xxx.xxx.xxxかつdstのホストIPがyyy.yyy.yyy.yyyかつTCPポート80番

$ tcpdump -r sample.pcap ip dst xxx.xxx.xxx.xxx and ip src yyy.yyy.yyy.yyy and tcp port 80 -n

Wireshark

  • フィルター例

http.request and http contains Root=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   # ALBにおけるアクセスログとキャプチャの関連付け
http.response.code == 502
tcp.flags.reset == 1

ip.addr == 10.0.0.1 && tcp.flags.fin
ip.src == 10.0.0.1 or ip.src == 10.0.0.2
ip.dst == 10.0.0.1
eth.src [0:3] == 00:00:83
tcp.port in {443, 80, 8080}

Command Gでパケット番号による検索。

  • フィルター詳細 https://www.wireshark.org/docs/dfref/

カーネルソースコード入手

# yumdownloader --source kernel
Loaded plugins: auto-update-debuginfo, priorities, update-motd, upgrade-helper
Enabling ius-source repository
Enabling amzn-updates-source repository
Enabling amzn-main-source repository
31 packages excluded due to repository priority protections
kernel-4.9.93-41.60.amzn1.src.rpm                                                                                                                                                     | 136 MB  00:00:03     
# rpm2cpio kernel-4.9.93-41.60.amzn1.src.rpm | cpio -id
1363606 blocks
# tar -xf linux-4.9.93.tar
# ls linux-4.9.93/
arch   certs    CREDITS  Documentation  firmware  include  ipc     Kconfig  lib          Makefile  net     REPORTING-BUGS  scripts   sound  usr
block  COPYING  crypto   drivers        fs        init     Kbuild  kernel   MAINTAINERS  mm        README  samples         security  tools  virt

Yumレポジトリ中のrpmの中のJavaを確認

# Get rpm from Yum repository
$ wget <HTTPS URL for rpm in Yum repos>

# Decompress rpm file
$ rpm2cpio aws-hm-client-4.2.0-1.amzn2023.noarch.rpm | cpio -id

# Decompress jar file
$ cd usr/share/aws/hmclient/lib
$ jar xf aws-glue-datacatalog-client-common-4.2.0.jar

# Open .class file with IntelliJ

screen

Ctrl+a c : ウィンドウ新規作成
Ctrl+a w : ウィンドウ一覧
Ctrl+a num : ウィンドウ切り替え
Ctrl+a a : ウィンドウ間の行き回
Ctrl+a [ : スクロールモード

Ctrl+a d : セッションをデタッチ
exit: セッションを終了

Ctrl+a S : 画面垂直分割(リージョン分割)
Ctrl+a tab : リージョン切り替え
Ctrl+a x : リージョン削除

作業再開時 : screen -r [Session ID]
指定した名前でセッション新規作成 : screen -S [Session ID]

セッション一覧 : screen -ls
セッション終了 :  screen -XS <Session ID> kill

Copy & Paste : Ctrl + [ ,  Ctrl + ]

.screenrcには以下の設定を追加。

defscrollback 10000         # スクロールバッファを10000行に設定

# ステータスライン設定
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'

# マウス操作を有効化
mousetrack on
termcapinfo xterm* ti@:te@
  • SCREEN Quick Reference

ディスク容量いっぱい

不要ファイルの洗い出し

キャッシュ周りやデプロイ毎に作成されるファイルで、古いものが残っている等の類のものを優先的に見ていく。

$ du -sh * | sort -h -r
$ du --max-depth 5 -h * | sort -h -r

yumのキャッシュを確認

  • 消すものがさくっとでてこないときにとりあえず

du -sh /var/cache/yum

前者で十分な事が多いが、容量がいっぱいだと、前者のコマンドも容量不足で実行できないことがある。その場合後者を実行すれば良い。

yum clean all
rm -Rf /var/cache/yum
  • Links

    • ディスク容量が逼迫しているけど消せるファイルが無い時に試すコマンド

BPF

  • References

    • BPF Performance Tools: Linux System and Application Observability (book)

その他

Unix時間を変換

$ date -ud '@1589500800'
2020年  5月 15日 金曜日 00:00:00 UTC

MacOSでは以下

$ date -ur 1589500800
2020年 5月15日 金曜日 00時00分00秒 UTC

10進数へ変換

2進数

$ echo $((2#101))

16進数

$ echo $((16#afaf))

ALBで502生成

$ sudo iptables -A INPUT -s 192.168.0.10 -p tcp --dport 80 -j REJECT --reject-with tcp-reset

macOS

ターミナル

  • Macの「ターミナル」のキーボードショートカット

VSCode

マークダウン表示

  • Command + k -> v

    • 画面分割して表示

  • Command + Shift -> v

    • 別タブで表示

参考資料

  • https://qiita.com/sion_cojp/items/04a2aa76a1021fe77079

  • https://qiita.com/taiyop/items/bfeeb41259cb0d083d88#_reference-dfefbef0995e80f8203e

  • https://qiita.com/ngyuki/items/0edecb8b92fcf189ac2b

  • http://saosao-0706.hatenablog.com/entry/2016/04/21/101656

  • https://qiita.com/rsooo/items/42f0902d42bab6ecf175

  • https://qiita.com/tksnino/items/300e39279ca57d9515f2#_reference-f0f5976f3c0d65c5026c

  • https://qiita.com/hiro-d/items/c3f724cb3d377e21cd91

  • https://linuxize.com/post/how-to-use-linux-screen/

  • https://qiita.com/hnishi/items/3190f2901f88e2594a5f

  • https://unix.stackexchange.com/questions/26685/how-to-split-window-vertically-in-gnu-screen

  • https://support.apple.com/ja-jp/guide/terminal/trmlshtcts/mac

Linux コマンド例 まとめ

  • apt-cache

  • apt-chrom

  • apt-get

  • arp

  • chkconfig

  • createuser

  • crontab

  • df

  • dig

  • dmesg

  • dmidecode

  • dpkg

  • expect

  • fdisk

  • fio

  • firewall-cmd

  • firewalld

  • free

  • fsck

  • gcc

  • gdb

  • grep

  • hdparm

  • host

  • ifconfig

  • insmod

  • iostat

  • iotop

  • ip

  • iptables

  • journalctl

  • kill

  • limit

  • lshw

  • lsmod

  • lspci

  • lsusb

  • lspci

  • lsusb

  • ltrace

  • lvcreate

  • lvextend

  • lvreduce

  • mkfs

  • mkswap

  • modprobe

  • mount

  • mtr

  • netstat

  • nmtui

  • nslookup

  • ntpq

  • ntpdate

  • parted

  • pidof

  • ping

  • postfix

  • postqueue

  • postsuper

  • pstree

  • resize2fs

  • rmmod

  • route

  • rsync

  • sar

  • screen

  • script

  • service

  • smartctl

  • snmpwalk

  • ss

  • strace

  • swapon

  • sysctl

  • systemctl

  • tail

  • tcpdump

  • top

  • traceroute

  • ulimit

  • uptime

  • vgcreate

  • vgrename

  • vgextend

  • w

  • watch

  • yum

参照

  • コマンドで覚えるLinux 単行本 – 2016/10/12 一戸 英男 (著)

    • https://www.amazon.co.jp/dp/4802610327

Previousサービス障害が発生した場合の対応方法Nextコピペで使えるELBのアクセスログ解析による事象分析 (ShellScript, Athena)

Last updated 1 month ago

Linux Performance Observability Tools