導航:首頁 > 編程大全 > 資料庫iostat1

資料庫iostat1

發布時間:2024-12-25 23:15:17

A. 如何查看linux下進程的IO活動狀況 00 Hey,Linux

前段時間,幾台測試伺服器的Web應用響應速度非常慢,系統負載也比較高,> 10, 但CPU和內存卻很閑,於是懷疑是磁碟的性能瓶頸,通過vmstat和iostat看到IO的讀寫量非常大,尤其是用iostat -x 1命令可以很直觀的看到IO的使用率一直在100%。
但究竟是什麼進程導致的高IO呢,由於每台伺服器上都有JBoss和MySQL的存在,JBoss會不停的產生很多小的數據文件和生成文本資料庫的數據,而MySQL則會不停的從Master同步新的數據。因此我們懷疑是這兩個進程導致的高IO,通過停止了JBoss和MySQL之後,IO立刻降為0%. 但我們還是不能確定誰是主因,於是尋找可以查看特定進程IO的方法。
最後,找到了兩個方法可以查看進程IO的活動狀況。
1. 第一個方法是通過一個python腳本來實現。
方法是將以下內容另存為一個叫io.py的腳本中,然後直接以root身份執行腳本,就可以看到如下圖所示的信息(由於我們已經通過升級到SSD硬碟解決了MySQL的IO問題,所以不能提供關於MySQL的截圖了),其中出現次數最多,數據最大的進程,就是導致高IO的主因。不過比較遺憾的是這個腳本並不能顯示進程在每一秒的准確的IO讀寫。

# vim io.py
# chmod +x io.py
# ./io.py
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by http://www.vpsee.com

import sys, os, time, signal, re

class DiskIO:
def __init__(self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0

def main():
argc = len(sys.argv)
if argc != 1:
print "usage: ./iotop"
sys.exit(0)

if os.getuid() != 0:
print "must be run as root"
sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 > /proc/sys/vm/block_mp')
print "TASK PID READ WRITE"
while True:
os.system('dmesg -c > /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(\
'^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print "%-10s %10s %10d %10d" % \
(item.pname, item.pid, item.reads, item.writes)

def signal_handler(signal, frame):
os.system('echo 0 > /proc/sys/vm/block_mp')
sys.exit(0)

if __name__=="__main__":
main()

2. 另一個方法是將Linux的內核升級到 >=2.6.20,然後安裝一個iotop軟體來實現。
不過這種改動並不適用於生產環境,因為在RHEL5.6和5.7上,內核都在 2.6.20以下。但是它所顯示的結果是非常准確的,所以對於新上線的機器以及測試環境,非常值得一試,具體方法如下:

下載和升級新內核(>=2.6.20),編譯時打開 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 選項。
解壓內核後進入配置界面:
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz
# tar jxvf linux-2.6.39.tar.gz
# mv linux-2.6.39 /usr/src/
# cd /usr/src/linux-2.6.39
# make oldconfig //使用make oldconfig可以繼承老的kernel的配置,為自己的配置省去很多麻煩。
# make menuconfig
把General setup - Enable per-task storage I/O accounting這個選項選上。

# vim .config
將#CONFIG_SYSFS_DEPRECATED_V2 is not set的注釋去掉的,將其改為y,即修改為CONFIG_SYSFS_DEPRECATED_V2=y。
保存內核後編譯內核:
# make
# make moles
# make moles_install
# make install
修改默認以新的內核啟動:
# vi /boot/grub/grub.conf
default=0
將新的內核配置文件復制到/boot目錄:
# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39
重啟伺服器:
# reboot
# uname –r
2.6.39
重啟完成後確認內核版本是否正確。
源碼安裝iotop所需的Python 2.7.2(>= 2.5):
# wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
# tar xzvf Python-2.7.2.tgz
# cd Python-2.7.2
# ./configure
# make; make install
下載並安裝iotop:
# wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.bz2
# tar -xjvf iotop-0.4.4.tar.bz2
# cd iotop-0.4.4
# python setup.py build
# python setup.py install
然後就可以使用iotop看到如下圖所示的信息:

B. linux和k8s和資料庫筆記

有關linux:

1、卸載某一個特定的掛在點。

umount /dev/datavg01 /data01

2、移掉lvm。

vgremove /dev/datavg01

3、拷貝數據。

scp -r /home/gaoge.txt [email protected]:/opt 或rsync -av /root/rpmpkgs /tmp/backups/

4、顯示系統盤符並以樹狀格式展開。

lsblk。

5、掃描新增設備。

echo "---" >/sys/class/scsi-host/hosto/scan

6、強行殺死mysql

kill -9 $(ps -ef | grep mysql)

7、將文件內容以每一行5個的形式展示出來。

cat test2.txt | xargs -n 5

8、用cut去實現awk切割列的效果

cat/etc/passwd | cut -d : -f 2

9、sed、grsp、awk。之前已經說過了、具體看 從linux三劍客說起 這篇。

10、增加一個oracle用戶讓其屬於oinstall組同時也隸屬於dba組。useradd oracle -g oinstall -G dba

11、新建立一個組groupnew並將組id修改為255。

groupadd -g 255 groupnew

12、將本地/dev/hdb整盤中的數據備份到/dev/hdd上。

dd if=/dev/hdb of=/dev/hdd

13、查看伺服器cpu個數。

cat /proc/cpuinfo | grep "physical id" | wc -l

14、查看伺服器io狀況並以每間隔1秒的速度輸出5次。

iostat 1 5

15、查看伺服器內存使用情況並以每間隔2秒的速度輸出10次。

vmstat 2 10

16、將gaoge.txt中的第一列db2找到並將db兩個字元用ab替換。

cat gaoge.txt |grep db2 | awk -F 2 '{print $1}' | tr db ab

17、將包名解壓到指定目錄。

tar -cxvf 包名 -C 指定的目錄

18、linux中前後台任務切換。

ctrl+z 切換到後台、jobs顯示id、fg + id 切換至前台。

19、殺掉top下stopped的進程。

ps -A -ostat,ppid,pid,cmd |grep -e '^[T]'

然後在進行kill

20、監控cpu狀態。

mpstat

21、查看虛擬內存使用了多少。

swapon

22、每月1到10號4:45重啟nginx。

crontab -u root -l 顯示root當前的計劃任務。

crontab -u root -e 後輸入以下內容並保存退出。

45 4 1,10 ** systemctl start nginx

23、awk列印df -h 的第一列、第三列、最後一列。

df -h | awk '{print $1 " " $3 " " $NF}'

24、批量拉、打標簽、推docker鏡像的shell腳本。

#!/bin/bash
for image in 'docker images | grep 10.171.10.1:10000 | awk ' { print $1 ":" $2 }
do
version = 'echo $image | awk -F / ' { print $2 } '
docker tag $image 192.168.10.1/$version
docker push 192.168.10.1/$version
done


25、正則表達式匹配電話號碼。

(?0d{2}[) -]?d{8}

26、編譯安裝三步驟。

./configure --prefix=安裝目錄

make

make install


有關kubernetes:

將kubernetes中pod的數據拷貝到物理宿主機上。

kubectl cp gyl-run/gyl-mysql-01020304: /opt/docker.sh /opt

將kubernetes中物理宿主機上的數據拷貝到pod中。

kubectl cp /opt/docker.sh gyl-run/gyl-mysql-01020304: /opt

檢查當前用戶有沒有許可權在k8s中創建資源許可權。

kubectl auth can-i '*' '*'

檢查當前用戶有沒有許可權在k8s集群中創建namespace許可權。


kubectl auth can-i create pods --all-namespaces

查看集群是否 健康 。

kubectl get cs


有關資料庫:

查看 mysql 二進制日誌格式。

show variables like 『%binlog_format%』

查看所有二進制日誌文件

show master logs

查看正在寫入的二進制日誌

show master status

格式化二進制顯示為sql格式

mysqlbinlog --base64 --output=decode-rows -v --start-date="2019-01-25 00:00:00" --stop-date=「2019-01-26 17:30」 master-bin.000006

利用bin-log去還原數據

/usr/bin/mysqlbinlog --no-default /var/lib/mysql/mysql-bin.00001 | usr/bin/mysql -u root -p pwd test

連接 postgresql

psql -U 用戶名 -d 數據

資料庫名 -h 主機地址 -p埠(默認埠為5432)

l 顯示資料庫列表

d 顯示所有表

d 表名稱 顯示表結構

顯示所有資料庫用戶

c 資料庫名 連接資料庫

q 退出pg窗口

pg備份:

pg_mp -U kong -d kong -f /opt/2019-01-26-pg.sql

pg還原:

psql -d kong -U kong -f /opt/2019-01-26-pg.sql

mongo 批量更新數據:把age大於20的class name修改為,設置multi為true

C. Linux裡面uptime命令作用是什麼

[root@oldboy ~]# uptime
11:45:25 up 5 days, 13:20, 3 users, load average: 0.00, 0.01, 0.05

uptime內容顯示的內容一次是系統時間,開機到現在的天數,用戶登錄數,以及平均負載。
核心是平均負載,其實就是【單位時間內的活躍進程數】。

2顆,單顆4核CPU為例:
1分鍾:10.00 #CPU處理進程1分鍾的繁忙程度,忙碌1分鍾。
5分鍾:8.01 #CPU處理進程5分鍾的繁忙程度,忙碌了5分鍾
15分鍾:5.05 #CPU處理進程15分鍾的繁忙程度,忙碌持續15分鍾,15分鍾內平均值5.

uptime:故障恢復了。
1分鍾:1.00 #CPU處理進程1分鍾的繁忙程度,忙碌1分鍾。
5分鍾:8.01 #CPU處理進程5分鍾的繁忙程度,忙碌了5分鍾
15分鍾:5.05 #CPU處理進程15分鍾的繁忙程度,忙碌持續15分鍾,15分鍾內平均值5.

==============================================
總結:15分鍾負載值12,是高是低呢
負載數值/總的核心數=1 #開始慢的臨界點,實際上1*70%==關注的臨界點。
12/8=1.2 大於1就說明有問題。

負載不要超過5,是臨界點。
2顆單顆4核CPU,共8核,負載就是8*70%=5左右。

需要關注負載的值:總的核心數*70%=關注的點

==================要掌握的============================
1.平均負載是運行隊列中活躍的進程數。
2.平均負載,1,5,15分鍾內的負載。
3.需要關注負載的值:總的核心數*70%=關注的點
4.輔助top,ps,uptime,sar,mpstat,pidstat,iostat,排查問題。
5.strace跟蹤進程系統調用。
6.記住幾個案例(面試講故事)。

面試官問:
你在工作中遇到過哪些生產故障,是怎麼解決的?
最好和資料庫相關(負載高),和web相關(PHP進程100%,JAVA內存泄漏)
==================要掌握的============================
***6.平均負載案例分析實戰\***
下面,我們以三個示例分別來看這三種情況,並用 stress、mpstat、pidstat 等工具,找出平均負載升高的根源。
stress 是 Linux 系統壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景。
mpstat 是多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標,以及所有 CPU 的平均指標。
pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內存、I/O 以及上下文切換等性能指標。

#如果出現無法使用mpstat、pidstat命令查看%wait指標建議更新下軟體包
yum install sysstats -y
yum install stress -y
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

***場景一:CPU 密集型進程\***

1.首先,我們在第一個終端運行 stress 命令,模擬一個 CPU 使用率 100% 的場景:

[root@oldboy ~]# stress --cpu 1 --timeout 600

2.接著,在第二個終端運行 uptime 查看平均負載的變化情況

# 使用watch -d 參數表示高亮顯示變化的區域(注意負載會持續升高)
[root@oldboy ~]# watch -d uptime

*3.最後,在第三個終端運行 mpstat 查看 CPU 使用率的變化情況*

# -P ALL 表示監控所有CPU,後面數字5 表示間隔5秒後輸出一組數據
[root@oldboy ~]# mpstat -P ALL 5

#單核CPU,所以只有一個all和0

4.從終端二中可以看到,1 分鍾的平均負載會慢慢增加到 1.00,而從終端三中還可以看到,正好有一個 CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負載的升高正是由於 CPU 使用率為 100% 。那麼,到底是哪個進程導致了 CPU 使用率為 100% 呢?可以使用 pidstat 來查詢

![](18.Linux系統管理-進程管理.assets/a.png)

# 間隔5秒輸出一組數據
[root@oldboy ~]# pidstat -u 5 1

#從這里可以明顯看到,stress進程的CPU使用率為100%。

- 模擬cpu負載高 `stress --cpu 1 --timeout 100`
- 通過uptime或w 查看 `watch -d uptime`
- 查看整體狀態mpstat -P ALL 1 查看每個cpu核心使用率
- 精確到進程: pidstat 1

****場景二:I/O 密集型進程\****

1.首先還是運行 stress 命令,但這次模擬 I/O 壓力,即不停地執行 sync

[root@oldboy ~]# stress --io 1 --timeout 600s #利用sync()
stress --hdd 8 --hdd-bytes 1g # hd harkdisk 創建進程去進程寫

*2.然後在第二個終端運行 uptime 查看平均負載的變化情況:*

[root@oldboy ~]# watch -d uptime
18:43:51 up 2 days, 4:27, 3 users, load average: 1.12, 0.65, 0.00

*3.最後第三個終端運行 mpstat 查看 CPU 使用率的變化情況:*

# 顯示所有 CPU 的指標,並在間隔 5 秒輸出一組數據
[root@oldboy ~]# mpstat -P ALL 5

#會發現cpu的與內核打交道的sys佔用非常高

*4.那麼到底是哪個進程,導致 iowait 這么高呢?我們還是用 pidstat 來查詢*

# 間隔5秒後輸出一組數據,-u 表示CPU指標
[root@oldboy ~]# pidstat -u 5 1

#可以發現,還是 stress 進程導致的。

- 通過stress 模擬大量進程讀寫 `stress --hdd 4 `
- 通過w/uptime查看系統負載信息 `watch -d uptime`
- 通過top/mpstat 排查 `mpstat -P ALL 1 或 top 按1`
- 確定是iowati `iostat 1查看整體磁碟讀寫情況 或iotop -o 查看具體哪個進程讀寫`
- 根據對應的進程,進行相關處理.

***場景三:大量進程的場景 高並發場景 \***
*當系統中運行進程超出 CPU 運行能力時,就會出現等待 CPU 的進程。*

*1.首先,我們還是使用 stress,但這次模擬的是 4 個進程*

[root@oldboy ~]# stress -c 4 --timeout 600

*2.由於系統只有 1 個 CPU,明顯比 4 個進程要少得多,因而,系統的 CPU 處於嚴重過載狀態*

*3.然後,再運行 pidstat 來看一下進程的情況:*

# 間隔5秒後輸出一組數據
[root@oldboy ~]# pidstat -u 5 1

*可以看出,4 個進程在爭搶 1 個 CPU,每個進程等待 CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%。這些超出 CPU 計算能力的進程,最終導致 CPU 過載。*

****分析完這三個案例,我再來歸納一下平均負載與CPU\****
***平均負載提供了一個快速查看系統整體性能的手段,反映了整體的負載情況。但只看平均負載本身,我們並不能直接發現,到底是哪裡出現了瓶頸。所以,在理解平均負載時,也要注意:
平均負載高有可能是 CPU 密集型進程導致的;
平均負載高並不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
當發現負載高的時候,你可以使用 mpstat、pidstat 等工具,輔助分析負載的來源****

**系統負載的計算和意義**

進程以及子進程和線程產生的計算指令都會讓cpu執行,產生請求的這些進程組成"運行隊列",等待cpu執行,這個隊列就是系統負載, 系統負載是所有cpu的運行隊列的總和.

[root@oldboye ~]# w
20:25:48 up 95 days, 9:06, 1 user, load average: 2.92, 0.00, 0.00

//假設當前計算機有4個核心的cpu,當前的負載是2.92
cpu1 cpu2 cpu3 cpu4
2.94/4(個cpu核心) = 73%的cpu資源被使用,剩下27%的cpu計算資源是空想的

//假設當前的計算有2個核心的cpu,當前的負載是2.92
2.92/2 = 146% 已經驗證超過了cpu的處理能力

7. 日常故障排查流程(含日誌)

- w/uptime, 查看負載
- ps aux/top 看看 cpu百分比, io wait或者是內存佔用的高? (三高 cpu,io,內存)
- top檢查具體是哪個進程,找出可疑進程
- 追蹤這個進程使用情況,做什麼的?
- 看看對應**日誌**是否有異常
- 系統日誌: /var/log/messages(系統通用日誌) /var/log/secure(用戶登錄情況)
- 服務軟體的日誌

***3.那平均負載為多少時合理\***
*最理想的狀態是每個 CPU核心 上都剛好運行著一個進程,這樣每個 CPU 都得到了充分利用。所以在評判平均負載時,首先你要知道系統有幾個 CPU核心,這可以通過 top 命令獲取,或`grep 'model name' /proc/cpuinfo`*

系統平均負載被定義為在特定時間間隔內運行隊列中的平均進程數。如果一個進程滿足以下條件則其就會位於運行隊列中:
- 它沒有在等待I/O操作的結果
- 它沒有主動進入等待狀態(也就是沒有調用'wait')
- 沒有被停止(例如:等待終止)
《內容來自老男孩老師的課堂筆記》

D. 哪些因素影響了資料庫性能

以MySQL為例:
影響資料庫性能的主要因素總結如下:

1、sql查詢速度
2、網卡流量
3、伺服器硬體內
4、磁碟IO
以上因素並不容是時時刻刻都會影響資料庫性能,而就像木桶效應一樣。如果其中一個因素嚴重影響性能,那麼整個資料庫性能就會嚴重受阻。另外,這些影響因素都是相對的。
例如:當數據量並沒有達到百萬千萬這樣的級別,那麼sql查詢速度也許就不是個重要因素,換句話說,你的sql語句效率適當低下可能並不影響整個效率多少,反之,這種情況,無論如何怎麼優化sql語句,可能都沒有太明顯的效果。

閱讀全文

與資料庫iostat1相關的資料

熱點內容
java定義char 瀏覽:133
excel2007插入壓縮文件 瀏覽:70
怎麼設定自己公司的網站 瀏覽:324
如何在辦公軟體上直接復制文件 瀏覽:939
c語言程序設計矩陣運算 瀏覽:894
影響網路質量因素有哪些 瀏覽:587
最新win10秘鑰在線激活 瀏覽:192
cad導入su8文件無法使用 瀏覽:828
怎麼做編程入門 瀏覽:851
用織夢建手機網站 瀏覽:38
灌南數控編程怎麼學 瀏覽:957
系統apk圖標修改工具 瀏覽:121
蘋果6手機網路沒信號怎麼回事啊 瀏覽:378
手機掃描文件轉換成word 瀏覽:636
手機本地視頻的文件夾在哪裡 瀏覽:908
蘋果11無法安裝app找不到描述文件 瀏覽:363
咋新建cad文件 瀏覽:969
窩窩app怎麼樣自動關 瀏覽:228
蘋果電腦怎麼用wps生成多個文件夾 瀏覽:309
蘋果手機哪裡有賣 瀏覽:83

友情鏈接