in script ~ read.

linux获取系统线程数

之前在项目中发现了一个bug,是程序执行了一段时间之后,进程崩溃,崩溃提示的原因是由于 thread 资源不足,初步判定是程序中创建了线程没有释放(Maybe 卡住), 为了辅助定位这个问题,写了如下的脚本,检测进程所使用的线程数。

查看系统所限制的用户最大线程数:ulimit -a

获取系统线程数:

#*************************************************************************
#   > File Name: getSysThreadCount.sh
#   > Copyright 2014 BONC, Inc.
#   > Author: Harvey
#   > Mail: zhanghaoyu@bonc.com 
#   > Created Time: Fri 08 Jun 2018 09:33:34 AM CST
#   > Des:
#         本脚本放在xpkg/bin目录下
#         启动: nohup ./getSysThreadCount.sh &
#         每一分钟会打印一条日志至../log/thread_count.log中
#         行云进程退出后, 脚本也会退出
#************************************************************************/

#!/bin/bash

XCLOUD_PID=`cat pid`
PID_MAX=`cat /proc/sys/kernel/pid_max`
THREAD_MAX=`cat /proc/sys/kernel/threads-max`
LOG_PATH="../log/thread_count.log"
USER_FILE_HANDLE_MAX=`ulimit -n`
SYS_FILE_HANDLE_MAX=`cat /proc/sys/fs/file-max`
CUR_USER=`whoami`

# $1=CUR_SYS_THREAD_COUNT  $2=CUR_XCLOUD_THREAD_COUNT $3=CUR_XCLOUD_FILE_HANDLE_COUNT $4=CUR_USER_FILE_HANDLE_COUNT $5=CUR_SYS_FILE_HANDLE_COUNT
function dumpLog() {
    nowtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
    lineContent=`printf "$nowtime\tPID_MAX:%s\tTHREAD_MAX:%s\tCUR_XCLOUD_THREAD_COUNT:%06d\tCUR_SYS_THREAD_COUNT:%06d\nUSER_FILE_HANDLE_MAX:%06d\tSYS_FILE_HANDLE_MAX:%010d\tCUR_XCLOUD_FILE_HANDLE_COUNT:%06d\tCUR_USER_FILE_HANDLE_COUNT:%06d\tCUR_SYS_FILE_HANDLE_COUNT:%06d\n" $PID_MAX $THREAD_MAX $2 $1 $USER_FILE_HANDLE_MAX $SYS_FILE_HANDLE_MAX $3 $4 $5`
    echo "$lineContent" >> $LOG_PATH
}


while :
do
    CUR_SYS_THREAD_COUNT=`pstree -p | wc -l`
    CUR_XCLOUD_THREAD_COUNT=`pstree -p $XCLOUD_PID | wc -l`
    # CUR_XCLOUD_FILE_HANDLE_COUNT=`ls -l /proc/$XCLOUD_PID/fd/ | wc -l`
    CUR_XCLOUD_FILE_HANDLE_COUNT=`lsof -p $XCLOUD_PID | wc -l`
    # CUR_SYS_FILE_HANDLE_COUNT=`cat /proc/sys/fs/file-nr | awk '{print $1}'`
    CUR_SYS_FILE_HANDLE_COUNT=`lsof | wc -l`
    CUR_USER_FILE_HANDLE_COUNT=`lsof -u$CUR_USER |wc -l`
    dumpLog $CUR_SYS_THREAD_COUNT $CUR_XCLOUD_THREAD_COUNT $CUR_XCLOUD_FILE_HANDLE_COUNT $CUR_USER_FILE_HANDLE_COUNT $CUR_SYS_FILE_HANDLE_COUNT
    if [ $CUR_XCLOUD_THREAD_COUNT -eq 0 ] ; then
        exit
    fi
    sleep 1m
done