前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux||你的服务器怎么一片绿?

Linux||你的服务器怎么一片绿?

作者头像
小汪Waud
发布2023-02-03 14:55:24
8150
发布2023-02-03 14:55:24
举报
文章被收录于专栏:小汪Waud小汪Waud

最近用学校服务器跑RNA-seq数据的时候,遇到过好几次以下的情况,特别是序列比对、生成sam文件和sam转bam文件。

说实话这么绿的情况我只在我的基金里看到过,慌得一批,生怕哪天管理服务器的老师就来找我了。

究其原因,还是我在跑程序的时候,没有及时设置用多少内存和多少核心。

那么问题来了!

如何查看服务器的CPU信息

在任意目录下,使用cat /proc/cpuinfo查看CPU的信息

随便列举一个

重要参数信息

代码语言:javascript
复制
1.processor:逻辑处理器的id
2.physical id:物理封装的处理器的id
3.core id:该逻辑处理器所处物理CPU的物理核id
4.cpu cores:位于相同物理封装处理器的内核数量
5.siblings:该逻辑处理器所处物理CPU的逻辑处理器的数量

逻辑CPU:所谓的4核8线程,4核指的是物理核心。用Intel的超线程技术(HT)将物理核虚拟而成的逻辑处理单元,现在大部分的主机的CPU都在使用超线程技术,用一个物理核模拟两个虚拟核,即每个核两个线程,总数为8线程。 串行、并发和并行:串行指多个任务,执行时一个执行完再执行另一个。因此串行不宜使用多个节点,会浪费资源。并发指多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。并行指每个线程分配给独立的核心,线程同时运行。

如何操作

代码语言:javascript
复制
cat /proc/cpuinfo | grep 'physical id' | sort | uniq  # 抓取physical id

可以看出有两个physical id:0、1

代码语言:javascript
复制
cat /proc/cpuinfo | grep 'cpu core' | sort | uniq  # 抓取cpu core

cpu cores:14

代码语言:javascript
复制
cat /proc/cpuinfo | grep 'core id' | sort | uniq  # 抓取core id

core id:0~14(无7)

代码语言:javascript
复制
cat /proc/cpuinfo | grep 'processor' | sort | uniq  # 抓取processor

图太长只截了部分

processor:0~55

代码语言:javascript
复制
cat /proc/cpuinfo | grep 'siblings' | sort | uniq  # 抓取siblings

siblings:28

因此,我用的服务器上physical id有2个,cpu core有14个,core id有14个,processor有56个,siblings有28个。即该服务器的CPU有两个物理封装的处理器,每个物理封装的处理器有14个核,每个核有两个逻辑处理器,因此每个物理封装的处理器有28个逻辑处理器。

另外,通过lscpu也可以查看cpu信息

参数信息

代码语言:javascript
复制
1.Architecture:架构
2.CPU op-mode(s):支持的模式
3.Byte Order:字节排列的顺序
4.CPU(s):逻辑CPU个数
5.On-line CPU(s) list:在线的CPU列表,就好像华农的充电桩,坏掉就会下线
6.Thread(s) per core:每个核心的线程数
7.Core(s) per socket:每个物理CPU的核数
8.CPU socket(s):物理CPU的数量
9.NUMA node(s):MNUMA节点数量
10.Vendor ID:CPU厂商ID
11.CPU family:厂商设定的CPU家族编号

如何查看服务器内存和使用情况

1.top

红框中为内存信息

2.htop

3.ps

ps命令只能查看部分使用情况

对比下来,显然是htop更加的简洁清晰,需要注意的是htop需要另外安装。

代码语言:javascript
复制
conda install -y htop

一次性占用过多线程该怎么办

这还不简单?!全部kill掉!然后重新设置程序!

通过htop查看自己的进程,可以看到command里正在运行的程序

1.killall

代码语言:javascript
复制
# killall的帮助文档
[CPST2018301210701@localhost aligned]$ killall --help
Usage: killall [-Z CONTEXT] [-u USER] [ -eIgiqrvw ] [ -SIGNAL ] NAME...
       killall -l, --list
       killall -V, --version

  -e,--exact          require exact match for very long names
  -I,--ignore-case    case insensitive process name match
  -g,--process-group  kill process group instead of process
  -y,--younger-than   kill processes younger than TIME
  -o,--older-than     kill processes older than TIME
  -i,--interactive    ask for confirmation before killing
  -l,--list           list all known signal names
  -q,--quiet          don't print complaints
  -r,--regexp         interpret NAME as an extended regular expression
  -s,--signal SIGNAL  send this signal instead of SIGTERM
  -u,--user USER      kill only process(es) running as USER
  -v,--verbose        report if the signal was successfully sent
  -V,--version        display version information
  -w,--wait           wait for processes to die
  -Z,--context REGEXP kill only process(es) having context
                      (must precede other arguments)

我试过killall -u CPST2018301210701(CPST2018301210701是我的用户名),如果此时你运行了A命令,且除了A以外没有其他重要正在运行,可以采用这种方式杀掉程序,效果类似于你的电脑里开了游戏、视频、音乐,突然你按了电源键。

2.kill

显然在大多数时候,我们只需要杀掉某一类含有特定参数命令的进程,这个时候killall就不适用了。

我们可以通过kill命令来实现上述要求。通常是[kill + PID],但如果一个命令多线程运行,会有不同的PID号,当然可以通过脚本来依次kill,但我们采用更方便的命令完成上述操作。

红框里就是PID

代码语言:javascript
复制
ps -ef | grep wrapper | grep -v grep | awk '{print $2}' | xargs kill -9
# ps命令用来列出系统中正在运行的进程,类似于top和htop,-ef参数会显示所有的进程信息
# grep用于过滤特定的字符,grep warpper即显示包括wrapper的命令
# -v显示不包含匹配文本的行,grep -v grep即显示上一步筛选结果中不包括grep的命令
# awk在文件或字符串中基于指定规则浏览和抽取信息;awk '{print $2}'将上一步中过滤得到的进程进行打印,$2表示打印第二个域(PID,进程号) $0表示所有域,$1表示第一个域,$n表示第n个域。
# xargs是给命令传递参数的过滤器,把标准数据数据转换成命令行参数。在这里则是将获取前一个命令的标准输出然后转换成命令行参数传递给后面的kill命令。
# kill -9强制关闭进程

此外也可通过cut命令

代码语言:javascript
复制
ps -ef | grep test | grep -v grep | cut -c 9-15 | xargs kill -9 # cut -c 9-15仅显示第9-15个字符(即PID,进程号)

如何设置使用多少线程

对于使用集群的小伙伴来说,不同集群采用的提交作业的命令不一样,比如我们学校二综的集群采用LSF作业调度系统来负责计算资源的管理和批量处理作业的调度。因此其使用者可以通过bsub命令申请多个节点运行程序。

对于没有多个节点的服务器来说,只能通过程序自身的CPU设置。以序列比对为例。

通过hisat2 --help查看帮助文档

我们发现它有一个-p参数可以设置比对的线程数

以下是我的脚本

代码语言:javascript
复制
for ((i=62;i<=67;i++));
do
hisat2 -t -p 2 -x /home/Bioinfor/CPST2018301210701/ncbi/public/sra/reference/index/hg38/genome -1 /home/Bioinfor/CPST2018301210701/rna/data.fastq.double/data.fastq/SRR105029${i}_1.fastq -2 /home/Bioinfor/CPST2018301210701/rna/data.fastq.double/data.fastq/SRR105029${i}_2.fastq -S /home/Bioinfor/CPST2018301210701/ncbi/public/sra/aligned/SRR105029${i}.sam &
done

通过nohup bash aligned.sh运行并htop查看我的命令后

下方绿色的是正在运行的

我们发现最上方占用了13个线程,除去其他用户占用的1个线程,剩下的12个就是我们序列比对所占用的线程。

可我们明明设置的是-p 2即两个线程呀!

我又将-p依次改成了1 3 4发现hisat2 -p设置线程的时候本身存在着一个6倍的关系,即-p 1对应了6个线程,-p 2对应了12个线程,依次类推

我们再回头看看推文开头为什么会出现一片绿的情况,在查询了脚本以后,我发现-p参数为8,即我会占用48个线程,再加上其他用户使用的1个线程,共49个,49/56=87.5%,正好和下方CPU占用率吻合了!

人就用了1个,我用了48个还真挺不好意思

至于其他软件是否有其他的线程对应关系,就交给以后再去尝试吧~

参考资料:

https://blog.csdn.net/u012062455/article/details/78358113 https://mp.weixin.qq.com/s/vr__hseQcP3oAqjW217kSw https://blog.csdn.net/zhengyshan/article/details/80641770 https://blog.csdn.net/weiyichenlun/article/details/59108463

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小汪Waud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何查看服务器的CPU信息
    • 重要参数信息
      • 如何操作
        • 参数信息
        • 如何查看服务器内存和使用情况
          • 1.top
            • 2.htop
              • 3.ps
              • 一次性占用过多线程该怎么办
                • 1.killall
                  • 2.kill
                  • 如何设置使用多少线程
                  相关产品与服务
                  云服务器
                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档