sans_souciの日記

無憂茶房

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
;