vmstat/ps/bash on centos 7.7
vmstat と ps の結果を紐づけ
On CentOS v7.7
下準備
- /file/ _get_ps.sh
- /file/ _get_vmstat.shy
- /file/ mystart.sh
- /file/ mystop.sh
- /file/ mymakecsv.sh
- /file/ mysqlite3.sh
- /directory/ ./results.d
- /directory/ ./sql.d/
- /file/ ./sql.d/mycreatetable01.sql
- /file/ ./sql.d/mycreatetable02.sql
- /file/ ./sql.d/base.select.sql
/file/ _get_ps.sh
$ cat _get_ps.sh #!/bin/bash _basedate=$1 function _xps(){ while true;do _tmpdate=$( date +%Y.%m.%dT%H.%M.%S ) LANG=C ps -elwf > ./results.d/$1/ps.d/${_tmpdate}.csv # echo $! > tmp_ps.txt sleep 1s done } # # 2020.10.04 # ps -ew -o user,pid,ppid,pcpu,pmem,rss,vsize,size,stat,cmd | sed -re 's/^\s+//g' # #echo $$ > tmp_ps.txt _xps ${_basedate} &
/file/ _get_vmstat.sh
$ cat _get_vmstat.sh #!/bin/bash # added: {system(":") / 2020.10.04 # vmstat -n 1 | awk '{printf "%s %s\n",$0,strftime("%Y-%m-%d %H:%M:%S")}{system(":")}' > ./results.d/$1/vmstat.d/vmstat00.txt & # { vmstat -n 1 -t > ./results.d/$1/vmstat.d/vmstat00.txt & echo $! > tmp_vmstat.txt }
/file/ mystart.sh
$ cat mystart.sh #!/bin/bash mydate=$(date +%Y.%m.%dT%H.%M.%S) mkdir -p ./results.d/${mydate}/{vmstat.d,ps.d,s3.d,s3src.d} echo "latest directory: ./results.d/${mydate}" echo "${mydate}" > latest.dir.txt # bash ./_get_ps.sh ${mydate} bash ./_get_vmstat.sh ${mydate}
/file/ mystop.sh
$ cat mystop.sh #!/bin/bash # - STOP - vmstat cat tmp_vmstat.txt| xargs kill echo "vmstat has been stopped..." # - STOP - ps running ps auxw | grep -Pai "_get_ps\.s[h]" | awk -F' ' '{print $2}' | xargs kill echo "ps has been stopped..."
/file/ mymakecsv.sh
$ cat mymakecsv.sh #!/bin/bash # common srcbase="./results.d/"$(cat ./latest.dir.txt ) dstdir="./results.d/"$(cat ./latest.dir.txt )"/s3src.d/" # tmp0* tmp0000=$( mktemp ) tmp0114=$( mktemp ) tmp15zz=$( mktemp ) tmpzzzz=$( mktemp ) # srcdir_vmstat ****************************************************** srcdir_vmstat=${srcbase}"/vmstat.d/" srcdir_vmstat_file=${srcdir_vmstat}"vmstat00.txt" sed -n '3,$p' ${srcdir_vmstat_file} | \ sed -re 's/^\s+//' | \ sed -re 's/\s+/,/g' | \ sed -re 's/^(.+),(.+),(.+)$/\1,\2 \3/g' | sed -re 's/,/\t/g' > ${dstdir}"vmstat01.csv" # srcdir_ps ********************************************************** srcdir_ps=${srcbase}"/ps.d/" # srcdir_ps_file=${srcdir_ps}" for psfile in $(ls ${srcdir_ps});do cat ${srcdir_ps}${psfile} | \ sed -n '2,$p' | \ sed -re 's/\s+/ /g' > ${tmp0000} cat ${tmp0000} | \ cut --delimiter=' ' --fields=1-14 | \ sed -re 's/\s/\t/g' > ${tmp0114} cat ${tmp0000} | \ cut --delimiter=' ' --fields=15- > ${tmp15zz} tmpdate=$( echo ${psfile%.csv} | sed -re 's;^(.+)\.(.+)\.(.+)T(.+)\.(.+)\.(.+)$;\1-\2-\3 \4:\5:\6;' ) paste ${tmp0114} ${tmp15zz} | \ awk -v intmpdate="${tmpdate}" '{printf "%s\t%s\n",intmpdate,$0}' >> ${tmpzzzz} done # echo ${tmpzzzz} cat ${tmpzzzz} > ${dstdir}"ps01.csv"
/file/ mysqlite3.sh
$ cat mysqlite3.sh #!/bin/bash mybase="./results.d/"$(cat ./latest.dir.txt)"/" mysrc=${mybase}"s3src.d/" mylite3=${mybase}"s3.d/" s3file=${mylite3}"s3.s3" # ".vacuum;" create db file sqlite3 ${s3file} "vacuum;" echo "[ ${s3file} ] has been created..." # "< sql file: create table sqlite3 ${s3file} < ./sql.d/mycreatetable01.sql sqlite3 ${s3file} < ./sql.d/mycreatetable02.sql # ".import" sqlite3 -csv -separator $'\t' ${s3file} ".import ${mysrc}ps01.csv myps" sqlite3 -csv -separator $'\t' ${s3file} ".import ${mysrc}vmstat01.csv myvmstat"
/directory/ ./results.d
/file/ mystart.sh を参照。
/directory/ ./sql.d/
以下、参照されるsqlファイルが保存されてる。
/file/ ./sql.d/mycreatetable01.sql
$ cat sql.d/mycreatetable01.sql [create table myvmstat( procsr integer , procsb integer , memswapd integer , memfree integer , membuff integer , memcache integer , swsi integer , swso integer , iobi integer , iobo integer , sysin integer , syscs integer , cpuus integer , cpusy integer , cpuid integer , cpuwa integer , cpust integer , jstdate text );
/file/ ./sql.d/mycreatetable02.sql
$ cat sql.d/mycreatetable02.sql create table myps( mydate text , psF interger , psS text , psUID text , psPID integer , psPPID integer , psC integer , psPRI integer , psNI integer , psADDR text , psSZ integer , psWCHAN integer , psSTIME text , psTTY text , psTIME text , psCMD text );
/file/ ./sql.d/base.select.sql
$ cat sql.d/base.select.sql select vmstat.* , ps.* from myvmstat as vmstat left outer join myps as ps -- inner join myps as ps on vmstat.jstdate = ps.mydate -- limit 10 ;