How to check number of threads running per processor in Linux machine?

I have a machine which has 32 processor but i am really not sure how many threads are running. It has hyperthreading enabled. Is there a way i can find that all 32 processors are being used and how many threads are there in my linux box. Its a 64 bit processor. I am having very high load average problem on this box and recently increased number of processor from 16 to 32. It's a web server and still same problem. Can someone please advice.

See man page for ps and top. Try

ps -eLf
ps -eLf | wc -l

  #you can toggle thread display, see http://publib.boulder.ibm.com/infocenter/javasdk/tools/index.jsp?topic=%2Fcom.ibm.java.doc.igaa%2F_1vg0001475cb4a-1190e2e0f74-8000_1007.html

top -H

#also  press 1 (toggle), will show break down of cpu usage

top - 11:05:53 up 1 day,  1:57,  3 users,  load average: 0.25, 0.16, 0.11
Tasks: 281 total,   1 running, 277 sleeping,   0 stopped,   3 zombie
Cpu0  : 14.7%us,  8.0%sy,  0.0%ni, 76.9%id,  0.0%wa,  0.3%hi,  0.0%si,  0.0%st
Cpu1  : 11.1%us,  5.9%sy,  0.0%ni, 82.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  6.2%us, 10.6%sy,  0.0%ni, 83.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  3.4%us,  3.8%sy,  0.0%ni, 92.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8011456k total,  7841028k used,   170428k free,    40824k buffers
Swap:  8388600k total,   233920k used,  8154680k free,  1220248k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                 
 3716 qemu      20   0 4821m 4.1g 1668 S 32.8 53.8 511:41.44 qemu-kvm                                                                                                                
28028 josephgr  20   0 1589m 498m  27m S 14.3  6.4  84:11.67 firefox                                                                                                                 
 3810 root      20   0  258m  85m  11m S  4.0  1.1  34:13.66 Xorg                                                                          


Hyperthreading does not double your cores. Doubling your cores would double your cores.

I wrote a script about cpu and system info long before.maybe it can be help:b:

example from my test linux :slight_smile:

[root@sistem1lnx ~]# ./cpuinfo_unix_com

Script works within the -> bash <- SHELL  [OK]
======================================================================
Not Supported shells -> (ash,bsh,csh,tcsh..)
Not Tested shells -> (dash,mksh,psh,rc..)
======================================================================

======================================================================
VIRTUAL PLATFORM DETECTED !!

======================================================================

HOSTNAME --> sistem1lnx.testfo.com.tr
======================================================================

WARNING(s):
LSHW NOT FOUND!!
======================================================================

HT_SUPPORT: YES [ most likely !!! ] (in PHYSCIAL HOST )
HT status : IT is VM !! ( HT seems DISABLED via Operating System [but vm client already has virtual core(s)] )
======================================================================

VM VIEW  [ only ONLINE LOGICAL CPU(s) ]
======================================================================
0.(physical cpu) -->  0.(logical cpu) --> 0,4 ( vcore )
0.(physical cpu) -->  1.(logical cpu) --> 1,5 ( vcore )
0.(physical cpu) -->  2.(logical cpu) --> 2,6 ( vcore )
0.(physical cpu) -->  3.(logical cpu) --> 3,7 ( vcore )
1.(physical cpu) -->  4.(logical cpu) --> 4,8 ( vcore )
1.(physical cpu) -->  5.(logical cpu) --> 1,5 ( vcore )
1.(physical cpu) -->  6.(logical cpu) --> 2,6 ( vcore )
1.(physical cpu) -->  7.(logical cpu) --> 3,7 ( vcore )
======================================================================
======================================================================

 HARDWARE && SYSTEM INFORMATIONS..........
======================================================================
HARDWARE PLATFORM:  Phoenix Technologies LTD VMware Virtual Platform 6.00
======================================================================
TOTAL CPU SLOTS: 16 (PHYSICAL HOST)
CPU SOCKETS COUNT: ?
vCPU SOCKETS COUNT: 2
CORE SOCKETS PER CPU: Not Detected
VCORE_SOCKETS_PER_CPU: 4
THREAD PER CPU SOCKET: Not Detected
TOTAL THREADS (LOGICAL CPUs): [ Total Virtual Cores = 4 core(s) ] X [ 2 vCPU ] == 8 threads
CPU VENDOR: Intel
CPU Type: Intel(R) Xeon(R) CPU E5-2690 0 @ 2.90GHz
CPU Bit: 64 bit
Platform: x86_64
CPU Bit from Kernel CONF: 64 bit
======================================================================
TOTAL MEMORY SOCKETS: 64
INSTALLED MEMORY DIMM(s): 1 X 4096 MB
EMPTY MEMORY SOCKETS: 63
======================================================================
Operating System: Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel Version: Linux 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009
Kernel SMP Support: YES
======================================================================

[root@sistem1lnx ~]#
# cat cpuinfo_unix_com
#!/bin/bash
# ygemici @unix.com
## Script Tested Systems ; Redhat 3-4-5,Fedora 6,15 ; OpenSuse 12,Centos 6,Ubuntu 10 ( !! on VIRTUAL PLATFORMS !! )
## Script not tested Debian platforms!!
## REDHAT 5-6 && SMBIOS 2.7 && has newer bios systems shows the THREAD/CORE Counts via 'dmidecode' ##
## Script does not use 'lscpu' for that there is not in the system default installion but tries to the lshw for get the some informations 
## Please feedback to me for wrong results or missing properties on the which you tested systems 
## may we can achieve more accurate results to improve this script

shellx=$(ps|grep $$|awk '{print $NF}')
clear

msg="Script has to execute with some bourne compatible shells ( bash,ksh,pdksh,zsh .. )"
extt() {
shl=$1
echo $shellx|awk '$1=="'$shl'"'|grep $shellx >/bin/null
if [ $? -eq 0 ] ; then echo "$msg" ; exit
fi
}
for i in ash bsh csh tcsh ; do
extt $i; done
cpuinf="/proc/cpuinfo"
cpusys=xxscpusxx
cpus=xxcpuxx
cpuhtsys=xxcpuhtsxx
cpuhts=xxcpuhtxx
TMP=/tmp
lc="wc -l"

SETCOLOR_FAILURE="echo -e \\033[1;31m"
SETCOLOR_RESET="echo -en \033[0m"
SETCOLOR_SUCCESS="echo -e \\033[1;32m"
SETCOLOR_WARNING="echo -e \\033[1;33m"
SETCOLOR_WARNINGN="\\033[1;33m"
SETCOLOR_PURPLE="echo -e \n\\033[0;35m"
SETCOLOR_WRITE="echo -en \\033[1;41m"
SETCOLOR_BOLDED="echo -en \033[1;40m"
SETCOLOR_YELLOW="echo -e \033[0;40m"

trap "echo -en '\033[0m'" SIGINT
$SETCOLOR_FAILURE"\nScript works within the -> $shellx <- SHELL  [OK] "
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
$SETCOLOR_FAILURE"Not Supported shells -> (ash,bsh,csh,tcsh..)"
$SETCOLOR_YELLOW"Not Tested shells -> (dash,mksh,psh,rc..)"
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"


sleep 1

$SETCOLOR_RESET
TOTAL_CORE=$(grep "core id" $cpuinf|$lc)
PER_CPU_CORE=$(awk '/core id/{a[$NF]++}END{for(i in a)print i}' $cpuinf|$lc)
CPU_VENDOR=$(awk '/vendor/{a[$3]++}END{for(i in a)print i}' $cpuinf)
CPU_COUNT=$(awk '/physical id/{a[$NF]}END{for(i in a)print i}' $cpuinf|$lc)
MEMORY_MB=$(awk '/MemTotal:/{print $2/1024}' /proc/meminfo)
CPU_FREQ=$(awk '/cpu MHz/{a[$NF]}END{for(i in a)print i}' $cpuinf)
OS_BIT=$(uname -m);KERNEL_VERSION=$(uname -rsv)
OS=$(awk '/Red Hat/||/SUSE/||/CentOS/||/Ubuntu/||/Debian/||/Fedora/{print}' /etc/issue|sed 's/\\[a-z]*//g')

kernel_V=$(uname -vrs|awk '{sub(".[0-9]*-.*","",$2);print $2*10}')
if [ $kernel_V -lt 25 ] ; then
$SETCOLOR_FAILURE "--> System has old kernel !!"
echo "Results may be inconsistent !!"
$SETCOLOR_RESET
fi

vm=0
##################### DMIDECODE ###########################
DMIDECODE=$(which dmidecode 2>/dev/null)
exs=$?
if [ $exs -ne 0 ] ; then
FLAGSTATUS=("${FLAGSTATUS[@]}\n""DMIDECODE NOT FOUND!!")
DMIDECODE="DMIDECODE NOT found!!"
$SETCOLOR_SUCCESS"'DMIDECODE' not found"
$SETCOLOR_FAILURE"Trying to finding the 'LSHW'\n"
$SETCOLOR_RESET
else

$DMIDECODE -t 4 2>/dev/null 1>&2
 if [ $? -eq 0 ] ; then
  if [ $vm -eq 1 ] ; then
   TOTAL_THREADS=$($DMIDECODE -t 4|awk '/Status/{if($0~/Populated/)print}'|$lc)
   CPU_SOCKETS=$($DMIDECODE -t 4|grep "Processor Information"|$lc)
  else
   #TOTAL_THREADS=$($DMIDECODE |awk '/Status/{if($0~/Populated/)print}'|$lc)
   CPU_SOCKETS=$($DMIDECODE -t 4|grep "Processor Information"|$lc)   
   CPU_COUNT=$($DMIDECODE -t 4|awk '/Status/{if($0~/Populated/)print}'|$lc)
  fi
 else
  CPU_SOCKETS=$($DMIDECODE |grep "Processor Information"|$lc)
  CPU_COUNT=$($DMIDECODE |awk '/Status/{if($0~/Populated/)print}'|$lc)
 fi

$DMIDECODE -t 17 2>/dev/null 1>&2
 if [ $? -eq 0 ] ; then
  MEMORY_ALL=$($DMIDECODE -t 17|awk '/^ *$/{x++};END{print x-1}')
  MEMORY_NONEMPTY=$($DMIDECODE -t 17|grep "Size:"|grep B|awk -F':'  '{a[$NF]++}END{for(i in a)print a" X" i}')
  NONEMPTYC=$(echo "$MEMORY_NONEMPTY"|sed 's/[^0-9][0-9]*//g')
  EMPTYC=$(awk -va="$MEMORY_ALL" -vb="$NONEMPTYC" 'BEGIN{print a-b}')
 else
  MEMORY_ALL=$($DMIDECODE|grep "DMI type 17"|$lc)
  MEMORY_NONEMPTY=$($DMIDECODE|awk -F':' '/DMI type 17/{w=1}/DMI type 19/{w=0}w{if($0~/Size/)a[$NF]++}END{for(i in a)if(i!~/No/)printf "%s%s%s%s",a," X",i," + " ; print "END"}')
  NONEMPTYC=$(echo "$MEMORY_NONEMPTY"|sed 's/[^0-9][0-9]*//g')
  MEMORY_EMPTY=$($DMIDECODE|awk -F':' '/DMI type 17/{w=1}/DMI type 19/{w=0}w{if($0~/Size/)a[$NF]++}END{for(i in a)if(i~/No/)printf "%s%s%s",a," X",i}')
  if [[ -z "$MEMORY_EMPTY" ]] ; then EMPTYC=0 ; else EMPTYC=$(echo "$MEMORY_EMPTY"|sed 's/[^0-9][0-9]*//g') ; fi
 fi

## hardware detect from dmidecode
H_PLATFORM=$($DMIDECODE|awk -F':' '/Product Name: /{print $NF;exit}')
H_PLATFORM2=$($DMIDECODE|awk -F':' '/Vendor: /{print $NF;exit}')
H_PLATFORM3=$($DMIDECODE|awk -F':' '/Version: /{print $NF;exit}')

H_PLATFORM=$H_PLATFORM2${H_PLATFORM}${H_PLATFORM3}
echo "$H_PLATFORM"|grep "$H_PLATFORM2" >/dev/null
if [ $? -eq 0 ] ; then
 H_PLATFORM2=""
fi
checksmb=$($DMIDECODE|awk '/SMBIOS/{if($2<=2.3)print "ok"}' )
  if [ "$checksmb" = "ok" ] ;then
  FLAGSTATUS=("${FLAGSTATUS[@]}\n""SMBIOS version OLD!!")
  smbios='nok'
  else
  smbios='ok'
  fi
  if [ "$smbios" = "ok" ] ; then
 CPU_SOCKETS=$($DMIDECODE|grep "Processor Information"|$lc)
  fi
fi


##################### LSHW ################################
LSHW=$(which lshw 2>/dev/null )
exl=$?
  if [ $exl -ne 0 ] ; then
FLAGSTATUS=("${FLAGSTATUS[@]}\n""LSHW NOT FOUND!!")
LSHW="LSHW NOT found!!"
  else
  #$SETCOLOR_SUCCESS"LSHW is [OK]"
CPU_FREE_SLOTS=$($LSHW -C cpu|grep empty|$lc)
CPU_SOCKETS=$($LSHW -C cpu|grep slot|$lc)
CPU_COUNT=$(awk -va="$CPU_SOCKETS" -vb="$CPU_FREE_SLOTS" 'BEGIN{print a-b}')

 if [ $exs -ne 0 ] ; then
  MEMORY_ALL=$($LSHW -C memory|grep "description: DIMM"|$lc)
  MEMORY_NONEMPTY=$($LSHW -C memory|awk -F':' '/bank/{w=1}/cache/{w=0}w{if($0~/size/)a[$NF]++}END{for(i in a)print a" X",i}')
  NONEMPTYC=$(echo "$MEMORY_NONEMPTY"|sed 's/[^0-9][0-9]*//g')
  EMPTYC=$(awk -va="$MEMORY_ALL" -vb="$NONEMPTYC" 'BEGIN{print a-b}')
  H_PLATFORM=$($LSHW|awk '/product/{$1=$NF="";print;exit}')
  H_PLATFORM2=$($LSHW|awk -F':' '/vendor: /{print $NF;exit}')
  H_PLATFORM3=$($LSHW|awk -F':' '/version: /{print $NF;exit}')
 fi  
fi
######################################################



detect_vm() {
vm=1
if [ $TOTAL_CORE -eq 0 ] ; then
VCORE=1
grep "physical id" $cpuinf >/dev/null
if [ $? -eq 0 ] ; then
TOTAL_CORE=$(awk '/physical id/{a++}END{print a}' $cpuinf)
else
TOTAL_CORE=$(awk '/processor/{a++}END{print a}' $cpuinf)
fi
else
VCORE=X
fi

$SETCOLOR_FAILURE
awk 'BEGIN{$70=OFS="=";print}'
$SETCOLOR_BOLDED"VIRTUAL PLATFORM DETECTED !! "
$SETCOLOR_FAILURE
$SETCOLOR_RESET
if [ $exs -eq 0 ] && [ -z "$CPU_SOCKETS" ] || [ "$CPU_SOCKETS" = 0 ] ; then
CPU_SOCKETS=$($DMIDECODE -t 4|grep "Processor Information"|$lc)
fi
PER_CPU_CORE=$(find /sys/devices/system/cpu -name "core_id" -exec cat {} \; 2>/dev/null|awk '{a[$1]++}END{for(i in a)print i}'|$lc)
if [ $PER_CPU_CORE -eq 0 ] ; then
$SETCOLOR_FAILURE"NOT Detected the Virtual Sockets Information from sysfs !! (Probably System has an old kernel) "
$SETCOLOR_SUCCESS"Virtual Socket(s) assuming equals to the Logical Core(s)  "
else
V_CPU_COUNT=$(awk -va="$TOTAL_CORE" -vb="$PER_CPU_CORE" 'BEGIN{print a/b}')
PERCPUPHYSCORE=$(awk -va="$TOTAL_CORE" -vb="$V_CPU_COUNT" 'BEGIN{print a/b}')
V_TOTAL_CORES=$TOTAL_CORE
#TOTAL_CORE=$(awk -va=$PERCPUPHYSCORE 'BEGIN{print a*2}')
TOTALTHREAD="[ Total Virtual Sockets = "$V_TOTAL_CORES" threads ]"
#TOTALPERCORE="$PER_CPU_CORE"
fi
V_CPU_SOCKETS=$(awk -va="$CPU_SOCKETS" -vb="$PERCPUPHYSCORE" 'BEGIN{print a/b}')

}

echo "$H_PLATFORM"|egrep 'VMware|Virtuozzo|QEMU|KVM|Virtual|Xen' >/dev/null
if [ $? -eq 0 ] ; then
    detect_vm;
fi

if [ -z "$H_PLATFORM" ] ; then
 echo "$H_PLATFORM"|egrep 'VM|Virtual|HVM' >/dev/null
  if [ $? -eq 0 ] ; then
   detect_vm;
  else
   lspci 2>/dev/null|egrep 'VM|Virtual|HVM' >/dev/null
   if [ $? -eq 0 ] ; then
    detect_vm;
   else
    dmesg 2>/dev/null|egrep 'VMware|Virtuozzo|QEMU|KVM|Virtual|Xen'
    if [ $? -eq 0 ] ; then
    detect_vm;
     else
     egrep 'VMware|Virtuozzo|QEMU|KVM|Virtual|Xen' /proc/ide/hd*/model >/dev/null
      if [ $? -eq 0 ] ; then
    detect_vm;
    fi
 fi
fi
fi
fi

if [ $vm -eq 0 ] ; then
     $SETCOLOR_FAILURE"PHYSICAL PLATFORM DETECTED !!"
fi

## for QUEMU
#H_PLATFORMQEMU=$($DMIDECODE|awk -F':' '/Vendor: /{print $NF;exit}')
#echo "$H_PLATFORMQEMU"|grep -q "QEMU"
#if [ $? -eq 0 ] ; then
#H_PLATFORM2=$($DMIDECODE|awk -F':' '/Manufacturer: /{print $NF;exit}')
#fi
############################################################################################################


detect_ht_proc() {
if [ -n "$PERCPUPHYSCORE" ] ; then
HTONDTCT=$(awk '/siblings/{print $NF;exit}' $cpuinf)
if [[ "$PERCPUPHYSCORE" -eq "$HTONDTCT" ]] ; then
HTON="nok"
else
HTON="ok"
fi
else
HTON="nok"
fi

if [ "$OS_BIT" != "ia64" ] ; then
cpucores=$(awk '/cpu cores/{a[$0]=$NF}END{for(i in a)print a}' $cpuinf)
diffcpus=$(echo "$cpucores"|$lc)
if [ "$diffcpus" -ne 1 ] ; then
$SETCOLOR_WARNING"Maybe HOST has DIFFERENT CPU(S) ? "
else
siblings=$(awk '/siblings/{a[$0]=$NF}END{for(i in a)print a}' $cpuinf)
if [ -n "$cpu cores" ] && [ -n "$siblings" ] ; then
if [ "$cpucores" -eq "$siblings" ] ; then
HTON="nok"
else
HTON="ok"
fi
fi
fi
fi
}

#if [ "$OS_BIT" = "ia64" ] ; then


if [ -z "$CPU_COUNT" ] ; then
CPU_COUNT=$(awk '/^processor/{x++}END{print x}' $cpuinf)
fi

if [ -z "$PERCPUPHYSCORE" ] ; then
 PERCPUPHYSCORE=$(awk '/core id/{a[$NF]=$NF}END{for(i in a)x++;print x}' $cpuinf)
  if [ -z "$PERCPUPHYSCORE" ] ; then
   PERCPUPHYSCORE=$(awk '/cpu cores/{print $NF; exit}' $cpuinf)
  fi
fi

   if [ -z "$PERCPUPHYSCORE" ] ; then
    PERCPUPHYSCORE=1
   fi

if [ -z "$TOTAL_CORE" ] ; then
THREADPERCPU=1
TOTAL_CORE=(awk -v a="$PERCPUPHYSCORE" -v b="$CPU_COUNT" 'BEGIN{print a*b}')
else
THREADPERCPU=$(awk '/^siblings/{print $NF;exit}' $cpuinf)
fi

if [ -z "$THREADPERCPU" ] ; then
THREADPERCPU=1
fi


if [ "$PERCPUPHYSCORE" -eq "$THREADPERCPU" ] ; then
HTON=nok
if [ $vm -eq 1 ] ; then
HTON=nok_VM
fi
else
HTON=ok
fi

if [ -z "$HTON" ] ; then
 grep siblings $cpuinf > /dev/null
 if [ $? -eq 0 ] ; then
 detect_ht_proc
 else
  if [ -f /sys/devices/system/cpu/cpu0/topology/thread_siblings ] ; then
    grep ',' /sys/devices/system/cpu/cpu0/topology/thread_siblings >/dev/null
   if [ $? -eq 0 ] ; then
    grep ',00000001$' /sys/devices/system/cpu/cpu0/topology/thread_siblings >/dev/null
    if [ $? -ne 0 ] ; then
    HTON="ok"
    else
    HTON="nok"
    fi
   elif [ -f /sys/devices/system/cpu/cpu0/topology/thread_siblings_list ] ; then
    grep '-' /sys/devices/system/cpu/cpu0/topology/thread_siblings_list >/dev/null
    if [ $? -eq 0 ] ; then
    HTON="ok"
    not=0
    else
    not=1
    fi
    if [ $not -eq 1 ] ; then
     grep ',' /sys/devices/system/cpu/cpu0/topology/thread_siblings_list >/dev/null
     if [ $? -eq 0 ] ; then
     HTON="ok"
     else
     HTON="nok"
     fi
    fi
   fi
  fi
 fi
fi


REDH_RELEASE=$(sed -n '/Red Hat/s/.*release \([0-9]\.*[0-9]*\) .*/\1/p' /etc/redhat-release 2>/dev/null)
if [ -z "$REDH_RELEASE" ] ; then
$SETCOLOR_FAILURE"System is NOT like seem 'REDHAT variants'"
REDHAT="not"
else
REDHAT=$(echo|awk -va="$REDH_RELEASE" '{if(a>=3)print "ok"}')
if [ "$REDHAT" != "ok" ] ; then
HTON="notdetect"
fi;fi

if [ -z "$HTON" ] ; then
 HTON="notdetect"
fi

if [ $exs -ne 0 ] && [ $exl -ne 0 ] ; then
  H_PLATFORM=$(lspci -vv 2>/dev/null|awk -F':' '/Subsystem/{print $2;exit}')
  if [[ -z "H_PLATFORM" ]] ; then
   $SETCOLOR_SUCCESS"lspci is NOT installed"
   H_PLATFORM=$(awk -F'=' '/Manufacturer/{if($2!~/Linux/){print $2;exit}}' /proc/bus/usb/devices)
   if [[ -z "H_PLATFORM" ]] ; then
    $SETCOLOR_FAILURE"HARDWARE PLATFORM NOT DETECTED !!"
   fi
fi

awk 'BEGIN{$70=OFS="=";print}'
$SETCOLOR_FAILURE"\nCPU INFORMATION could NOT detected from DMIDECODE and from LSHW !!"
$SETCOLOR_FAILURE"RAM INFORMATION could NOT detected from DMIDECODE and from LSHW !!"

CPU_COUNT=$(awk '/physical id/{a[$NF]++}END{for(i in a)print i}' $cpuinf|$lc)

if [ $CPU_COUNT -eq 0 ] ; then
CPU_COUNT=1
fi

PERCPUPHYSCORE=$(awk '/core id/{a[$NF]++}END{for(i in a)print i}' $cpuinf|$lc)
if [ -z "$PERCPUPHYSCORE" ] ; then
PERCPUPHYSCORE=1
fi

 if [ $vm -ne 1 ] ; then
 if [ "$HTON" = "notdetect" ] ; then detect_ht_proc;fi
 if [ "$HTON" = "ok" ] ; then 
  TOTAL_CORE=$(awk -va="$PERCPUPHYSCORE" -vb="$CPU_COUNT" 'BEGIN{print a*b*2}')
  PERCPUPHYSCORE="$TOTALHPHYSCORE";TOTALPHYSCORE="$TOTALVIRTCORE"
  TOTALTHREAD="[ Total Physical Cores = "$TOTALPHYSCORE" ] + [ Total HT Cores = "$TOTALVIRTCORE" ] == $TOTAL_CORE threads"
 else
  TOTAL_CORE=$(awk -va="$PERCPUPHYSCORE" -vb="$CPU_COUNT" 'BEGIN{print a*b}')
  TOTALHPHYSCORE=$PERCPUPHYSCORE
  TOTALTHREAD="[ Total Physical Cores = "$TOTALHPHYSCORE" ] == $TOTAL_CORE threads"
  fi
fi
fi

if [ $vm -eq 1 ] ; then

if [ $VCORE = 1 ] ; then
PERVCPUPHYSCORE=1
else
PERVCPUPHYSCORE=$(awk '/core id/{a[$NF]=$NF}END{for(i in a)x++;print x}' $cpuinf)
fi

PERVIRTCORE=$PERVCPUPHYSCORE
TOTALVIRTCORE=$PERVCPUPHYSCORE
# TOTALPERVCORE=$TOTALVIRTCORE
TOTALTHREAD="[ Total Virtual Cores = "$PERVCPUPHYSCORE" core(s) ] X [ "$V_CPU_COUNT" vCPU ] == $TOTAL_CORE threads"
# TOTALPERVCORE="[ Virtual Cores = $PERVCPUPHYSCORE ] + [ HT Cores = $PERVIRTCORE ] == $PERCPUALLCORE threads"
fi

####################################################################################


if [ -z "$CPU_SOCKETS" ] || [ "$CPU_SOCKETS" -eq 0 ] ; then
CPU_SOCKETS="Unable to Getting the CPU Slots Information !!"
fi


cvrt() {
for i in PERCPUPHYSCORE PERVCPUPHYSCORE H_PLATFORM TOTALTHREAD TOTALPERCORE MEMORY_ALL MEMORY_NONEMPTY EMPTYC CPU_SOCKETS CPU_COUNT V_CPU_COUNT
do
  if [[ -z "$(eval echo "\$$i")" ]] ; then
  eval $i='?'
  fi
done
}


if [ $vm -eq 1 ] ; then 
CPU_SOCKETS=$(echo "$V_CPU_SOCKETS (PHYSICAL HOST)" )
CPU_COUNT=""
fi

#if [ -z "$CPU_COUNT" ] ; then
#CPU_COUNT=1
#CPU_COUNT="Unable to Getting the CPU Sockets Count Information !!"
#fi


cvrt;

uname -v|grep SMP >/dev/null
if [ $? -eq 0 ] ; then
SMP_OK="YES"
else
SMP_OK="NO"
fi

grep flags $cpuinf >/dev/null
if [ $? -eq 0 ] ; then
 grep flags $cpuinf |grep lm >/dev/null
 if [ $? -eq 0 ] ; then
CPU_BIT="64 bit"
 else 
grep flags $cpuinf |grep tm >/dev/null
   if [ $? -eq 0 ] ; then
CPU_BIT="32 bit"
   fi
 fi

if [ -z "$CPU_BIT" ] ; then
grep flags $cpuinf |grep rm >/dev/null
 if [ $? -eq 0 ] ; then
CPU_BIT="16 bit"
 fi
fi

grep flags $cpuinf|grep ht >/dev/null
 if [ $? -eq 0 ] ; then
HT_SUPP="YES"
if [ $vm -eq 1 ] ; then
HT_SUPP="YES [ most likely !!! ] (in PHYSCIAL HOST )"
fi
 else
HT_SUPP="NO"
if [ $vm -eq 1 ] ; then
HT_SUPP="NO [ most likely !!! ] (in PHYSCIAL HOST )"
fi
 fi

else
FLAGSTATUS=("${FLAGSTATUS[@]}\n""CPU FLAGS NOT FOUND FROM PROCFS!!")
HT_SUPP="UNKNOWN"
fi



## IA-32 && other Itanium Models ignored now

if [ "$CPU_VENDOR" = "GenuineIntel" ] ; then
   CPU_VENDOR="Intel"
   CPU_TYPE=$(awk -F":" '/model name/{print $2;exit}' $cpuinf|sed 's/^ *//'|sed 's/ * / /g')
  IS_ARCH_IA64=$(grep "arch " $cpuinf|awk '{print $NF;exit}')
 if [ "$IS_ARCH_IA64" = "IA-64" ] ; then
 CPU_BIT="64 bit(Itanium)"
 CPU_TYPE=$(awk -F':' '$0~/vendor|family|arch /{a[$0]=$NF}/cpu MHz/{gsub("\\.[0-9]*","");a[$0]=" @ " $NF/1000 "GHz"}
END{for(i in a)print a}' $cpuinf ORS=""|sed 's/^ *//' )
 fi
 elif [ "$CPU_VENDOR" = "AuthenticAMD" ] ; then
   CPU_VENDOR="AMD"
   CPU_TYPE=$(awk '/model name/{print $4 " " $5 " " $7;exit}' $cpuinf|sed 's/^ *//g')
 fi

$SETCOLOR_FAILURE
awk 'BEGIN{$70=OFS="=";print}'
$SETCOLOR_RESET
$SETCOLOR_BOLDED"\nHOSTNAME --> $(hostname)"
$SETCOLOR_FAILURE
awk 'BEGIN{$70=OFS="=";print}'
sleep 1

$SETCOLOR_RESET
$SETCOLOR_WARNING "\nWARNING(s): "
$SETCOLOR_RESET

FLAGSTATUS=$(echo -e "${FLAGSTATUS[@]}"|sed -n '/^ *$/!p')
$SETCOLOR_FAILURE"${FLAGSTATUS[@]}"

which getconf 2>/dev/null 1>&2
if [ $? -eq 0 ] ; then
getconf -a 2>/dev/null 1>&2
  if [ $? -eq 0 ] ; then
TOTAL_CORE=$(getconf -a|grep '_NPROCESSORS_ONLN'|awk '{print $2}')
  else
TOTAL_CORE=$(getconf '_NPROCESSORS_ONLN' 2>/dev/null)
  if [ $? -ne 0 ] ; then
TOTAL_CORE=0
  fi
 fi
else
$SETCOLOR_FAILURE"'getconf' NOT found !!"
fi 

awk 'BEGIN{$70=OFS="=";print}'
$SETCOLOR_RESET
$SETCOLOR_BOLDED"\nHT_SUPPORT: "
$SETCOLOR_RESET
$SETCOLOR_FAILURE"$HT_SUPP"

echo "$CPU_COUNT"|grep "Unable" > /dev/null
cpuex=$?


if [ $TOTAL_CORE -ne 0 ] && [ $cpuex -ne 0 ] ; then
if [ $vm -ne 1 ] ; then
PERCPUALLCORE=$(awk -va="$TOTAL_CORE" -vb="$CPU_COUNT" 'BEGIN{print a/b}')
else
PERCPUALLCORE="Not Detected"
fi
fi


if [ -z "$PERCPUALLCORE" ] ; then
PERCPUALLCORE=1
fi

if [ -z "$CPU_COUNT" ] ; then
echo hoo
exit
CPU_COUNT=1
fi

no_disabled() {
echo "$PERCPUALLCORE"|grep "Not" > /dev/null
perex=$?
if [ $perex -eq 0 ] ; then
PERCPUPHYSCORE="Not Detected"
TOTALPERCORE="Not Detected"
else
PERCPUPHYSCORE=$PERCPUALLCORE
TOTALTHREAD="[ Total Physical Cores = $TOTAL_CORE threads ]"
TOTALPERCORE="[ Physical Cores = $PERCPUALLCORE threads ]"
fi
}

yes_enabled() {
PERCPUPHYSCORE=$(echo|awk -va="$PERCPUALLCORE" '{print a/2}')
PERVIRTCORE=$PERCPUPHYSCORE
TOTALHPHYSCORE=$(echo|awk -va="$PERCPUPHYSCORE" -vb="$CPU_COUNT" '{print a*b}')
TOTALPERCORE="[ Physical Cores = $PERCPUPHYSCORE ] + [ HT Cores = $PERVIRTCORE ] == $PERCPUALLCORE threads"
TOTALVIRTCORE=$TOTALHPHYSCORE
$SETCOLOR_RESET
TOTALTHREAD="[ Total Physical Cores = $TOTALHPHYSCORE ] + [ Total HT Cores = $TOTALVIRTCORE ] == $TOTAL_CORE threads"
}

 if [ "$HTON" = "ok" ] ; then
  $SETCOLOR_SUCCESS"HT status :$SETCOLOR_WARNINGN ENABLED"
  $SETCOLOR_RESET
  yes_enabled;
 fi
if [ "$HTON" = "nok" ] ; then
$SETCOLOR_SUCCESS"HT status : DISABLED !!"
$SETCOLOR_RESET
no_disabled;
 fi

if [ "$HTON" = "nok_VM" ] ; then
$SETCOLOR_SUCCESS"HT status : IT is VM !! ( HT seems DISABLED via Operating System [but vm client already has virtual core(s)] )"
$SETCOLOR_RESET
no_disabled;
fi

if [ $vm -eq 1 ] && [ "$HTON" = "ok" ] ; then
$SETCOLOR_SUCCESS"HT status : IT is VM !! ( HT seems ENABLED via Operating System [vm client has not virtual core(s)] )"
$SETCOLOR_RESET
yes_disabled;
fi

if [ "$HT_SUPP" != "YES" ] ; then
if [ "$HTON" = "ok" ] || [ "$HTON" = "ok_VM" ] ; then
$SETCOLOR_SUCCESS"HT_SUPPORT DETECTS "$HT_SUPP" status VIA CPUFS(HOST), but your machine has HT seems ENABLED!!!"
fi 
fi


if [ "$HT_SUPP" = "UNKNOWN" ] ; then
if [ "$SMP_OK" = "NO" ] ; then
$SETCOLOR_SUCCESS"If you sure that the CPU has HT support,then you must use SMP kernel !!"
$SETCOLOR_RESET
no_disabled;
else
$SETCOLOR_SUCCESS"HT flags not detected from PROCFS !!"
$SETCOLOR_RESET
# for ITANIUMs needs a different solution. I must works on this but time !
fi
fi

if [ "$HT_SUPP" = "YES" ] ; then
 if [ "$HTON" = "notdetect" ] ; then
$SETCOLOR_SUCCESS"HT couldnot detected !!"
$SETCOLOR_FAILURE"Trying to detect CPU infos from procfs (Maybe Faulty Results !!)"
detect_ht_proc;
  if [ "$HTON" = "ok" ] ; then
  $SETCOLOR_FAILURE"HT is detected as -> [ON] "
  $SETCOLOR_SUCCESS
  elif [ "$HTON" = "nok" ] ; then
  $SETCOLOR_FAILURE"HT is detected as -> [ON] "
  fi
  read -p "HT is really enable on the BIOS (y/n) ? " c
   if [ "$c" = "y" ] ; then
    echo "ASSUMING 'HT is [ON]' "
    $SETCOLOR_RESET
    yes_enabled;
   else
    echo "ASSUMING 'HT is [OFF]' "
   no_disabled;
  fi
 fi
fi 

if [ "$HT_SUPP" = "NO" ] ; then
$SETCOLOR_SUCCESS"No HT Support !!"
$SETCOLOR_RESET
no_disabled;
fi


red() {
$SETCOLOR_FAILURE"$@"
$SETCOLOR_RESET
}
bolded() {
$SETCOLOR_RESET
$SETCOLOR_BOLDED"$1: "
}

# $SETCOLOR_WARNING"\nCPUID:COREID(s) VIEW FROM PROCFS "
# Cancelled via PROCFS VIEW

ht_menu_prep() {
  if [ $vm -eq 1 ] ; then
   view="VM VIEW"
   core_thread="vcore"
  else
   view="HT VIEW"
   core_thread="ht"
  fi
}

ht_cal() {
ht_menu_prep
  if [ $vm -eq 1 ] ; then
   physicalcount="$V_CPU_COUNT"
   allcorecount="$V_TOTAL_CORES"
  else
   physicalcount="$CPU_COUNT"
   allcorecount="$TOTAL_CORE"
  fi
 htcorecount=$(awk -va="$physicalcount" -vb="$allcorecount" 'BEGIN{print b/a}')
 #awk '/processor/{a[x++]=$NF}END{for(i=0;i<x;i++)printf "%s ",a}' $cpuinf
 awk '/physical id/{print $NF".("$1 " cpu) --> "}' $cpuinf > ${TMP}/$cpus
 for i in $(awk '/processor/{a[x++]=$NF}END{for(i=0;i<x;i++)printf "%s ",a}' $cpuinf); do
  if [ $i -gt "$htcorecount" ] ; then
   echo "$i.(logical cpu) --> $(awk -va=$i -vb=$htcorecount 'BEGIN{print a-b}'),$i ( $core_thread ) "
  elif [ $i -eq $htcorecount ] ; then
   echo "$i.(logical cpu) --> $i,$(awk -va=$i -vb=$htcorecount 'BEGIN{print a+b}') ( $core_thread ) "
  elif [ $i -lt $htcorecount ] ; then
   echo "$i.(logical cpu) --> $i,$(awk -va=$i -vb=$htcorecount 'BEGIN{print a+b}') ( $core_thread ) "
  fi
  done > ${TMP}/$cpuhts

$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
$SETCOLOR_PURPLE"$view" $SETCOLOR_WARNINGN "[ only ONLINE LOGICAL CPU(s) ]"
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
 awk 'NR==FNR{a[x++]=$0;next}{print a[i++],$0}' ${TMP}/$cpus ${TMP}/$cpuhts
}

if [ "$HTON" = "ok" ] || [ "$HTON" = "nok_VM" ] ; then

 if [ -d "/sys/devices/system/cpu" ] ; then

grep 0 /sys/devices/system/cpu/cpu*/online >/dev/null 2>&1
if [ $? -eq 0 ] ; then
$SETCOLOR_YELLOW"[ some logical cpu(s) is offline!! ]"
$SETCOLOR_FAILURE"[ check the system -> '/sys/devices/system/cpu/cpuX/online ' ]"
fi

  find "/sys/devices/system/cpu" -name "thread_siblings_list" |xargs grep "" >/dev/null
  
if [ $? -eq 0 ] ; then
ht_menu_prep
   for i in $(find "/sys/devices/system/cpu" -name "thread_siblings_list"); do echo "$i"|sed 's/[^0-9]*//g';cat $i; done|sed 'N;s/\(.*\)\n\(.*\)/\1.(logical cpu) --> \2 ( '${core_thread}' ) /' >${TMP}/$cpuhtsys
for i in $(find "/sys/devices/system/cpu" -name "physical_package_id"); do echo "$i"|sed 's/[^0-9]*//g';cat $i; done|sed 'N;s/\(.*\)\n\(.*\)/\1.(logical cpu) --> \2.(physical cpu) /' >${TMP}/$cpusys
   $SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
   $SETCOLOR_PURPLE "$view"
   $SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
   awk -F'-->' 'NR==FNR{a[$1]=$2;next}{if($1 in a)print a[$1] FS" " $0}' ${TMP}/$cpusys ${TMP}/$cpuhtsys
else
   find "/sys/devices/system/cpu" -name "thread_siblings" |xargs grep "" >/dev/null
    if [ $? -ne 0 ] ; then
      $SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
      $SETCOLOR_PURPLE"HYPERTHREAD IS ENABLED ON HOST BUT HT INFO NOT DETECTED FROM SYSFS ("${OS_BIT}") !!\n"
  $SETCOLOR_WARNING"Script is manuelly calculating the HT threads over the PROCFS"
      ht_cal
    else
 ht_cal
   fi
    fi

else
  $SETCOLOR_WARNING"There is a problem while reading the SYSFS"
fi 
fi  
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
 

$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
$SETCOLOR_PURPLE "HARDWARE && SYSTEM INFORMATIONS.........."
######################################################################################
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
bolded "HARDWARE PLATFORM" ; red "$H_PLATFORM"
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
bolded "TOTAL CPU SLOTS" ; red "$CPU_SOCKETS"
bolded "CPU SOCKETS COUNT"; red "$CPU_COUNT"
bolded "vCPU SOCKETS COUNT"; red "$V_CPU_COUNT"
bolded "CORE SOCKETS PER CPU" ; red "$PERCPUPHYSCORE"
bolded "VCORE_SOCKETS_PER_CPU" ; red "$PERVCPUPHYSCORE"
bolded "THREAD PER CPU SOCKET" ; red "$TOTALPERCORE"
bolded "TOTAL THREADS (LOGICAL CPUs)" ; red "$TOTALTHREAD"
# bolded "THREAD PER VCPU SOCKET" ; red "$TOTALPERVCORE"
bolded "CPU VENDOR" ; red "$CPU_VENDOR"
bolded "CPU Type" ; red "$CPU_TYPE"
bolded "CPU Bit" ; red "$CPU_BIT"
bolded "Platform" ; red "$OS_BIT"
bolded "CPU Bit from Kernel CONF" ; red "$(getconf LONG_BIT ) bit"
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
bolded "TOTAL MEMORY SOCKETS" ; red "$MEMORY_ALL"
bolded "INSTALLED MEMORY DIMM(s)" ; red "$MEMORY_NONEMPTY"
bolded "EMPTY MEMORY SOCKETS" ; red "$EMPTYC"
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
bolded "Operating System" ; red "$OS"
bolded "Kernel Version" ; red "$KERNEL_VERSION"
bolded "Kernel SMP Support" ; red "$SMP_OK"
$SETCOLOR_FAILURE"$(awk 'BEGIN{$70=OFS="=";print}')"
echo;$SETCOLOR_RESET
########################################################################################

regards
ygemici

1 Like