首页 > 解决方案 > 如何解冻用户的内存限制?

问题描述

这两天,我遇到了一个奇怪的问题。

STAR来自https://github.com/alexdobin/STAR是一个用于构建后缀数组索引的程序。我已经使用这个程序多年了。直到最近它都可以正常工作。

这些天,当我跑步时STAR,它总是会被杀死。

root@localhost:STAR --runMode genomeGenerate --runThreadN 10  --limitGenomeGenerateRAM 31800833920 --genomeDir star_GRCh38 --genomeFastaFiles GRCh38.fa --sjdbGTFfile GRCh38.gtf --sjdbOverhang 100
.
.
.
Killed

root@localhost:STAR --runMode genomeGenerate --runThreadN 10 --genomeDir star_GRCh38 --genomeFastaFiles GRCh38.fa --sjdbGTFfile GRCh38.gtf --sjdbOverhang 100
Jun 03 10:15:08 ..... started STAR run
Jun 03 10:15:08 ... starting to generate Genome files
Jun 03 10:17:24 ... starting to sort Suffix Array. This may take a long time...
Jun 03 10:17:51 ... sorting Suffix Array chunks and saving them to disk...
Killed

一个月前,具有相同输入和相同参数的相同命令运行正常。它确实需要一些内存,但不会很多。

我已经尝试了 3 个最近发布的这个程序版本,都失败了。所以我不认为这是STAR程序的问题,而是我的服务器配置问题。

我也尝试以root普通用户和普通用户的身份运行这个程序,每个人都不走运。

我怀疑我的服务器中的内存使用存在限制。

但是不知道内存是怎么限制的?我想知道是否有人可以给我一些提示。

谢谢!

以下是我的调试过程和系统信息。

命令dmesg -T| grep -E -i -B5 'killed process'显示它是Out of memory问题。

但是在STAR程序被杀死之前,top只显示 mem 的命令5%被这个 porgram 占用了。

[一 6  1 23:43:00 2020] [40479]  1002 40479   101523    18680     112      487             0 /anaconda2/bin/
[一 6  1 23:43:00 2020] [40480]  1002 40480   101526    18681     112      486             0 /anaconda2/bin/
[一 6  1 23:43:00 2020] [40481]  1002 40481   101529    18682     112      485             0 /anaconda2/bin/
[一 6  1 23:43:00 2020] [40482]  1002 40482   101531    18673     111      493             0 /anaconda2/bin/
[一 6  1 23:43:00 2020] Out of memory: Kill process 33822 (STAR) score 36 or sacrifice child
[一 6  1 23:43:00 2020] Killed process 33822 (STAR) total-vm:23885188kB, anon-rss:10895128kB, file-rss:4kB, shmem-rss:0kB

[三 6  3 10:02:13 2020] [12296]  1002 12296   101652    18681     113      486             0 /anaconda2/bin/
[三 6  3 10:02:13 2020] [12330]  1002 12330   101679    18855     112      486             0 /anaconda2/bin/
[三 6  3 10:02:13 2020] [12335]  1002 12335   101688    18682     112      486             0 /anaconda2/bin/
[三 6  3 10:02:13 2020] [12365]  1349 12365    30067     1262      11        0             0 bash
[三 6  3 10:02:13 2020] Out of memory: Kill process 7713 (STAR) score 40 or sacrifice child
[三 6  3 10:02:13 2020] Killed process 7713 (STAR) total-vm:19751792kB, anon-rss:12392428kB, file-rss:0kB, shmem-rss:0kB
--
[三 6月  3 10:42:17 2020] [ 4697]  1002  4697   101526    18681     112      486             0 /anaconda2/bin/
[三 6月  3 10:42:17 2020] [ 4698]  1002  4698   101529    18682     112      485             0 /anaconda2/bin/
[三 6月  3 10:42:17 2020] [ 4699]  1002  4699   101532    18680     112      487             0 /anaconda2/bin/
[三 6月  3 10:42:17 2020] [ 4701]  1002  4701   101534    18673     110      493             0 /anaconda2/bin/
[三 6月  3 10:42:17 2020] Out of memory: Kill process 21097 (STAR) score 38 or sacrifice child
[三 6月  3 10:42:17 2020] Killed process 21097 (STAR) total-vm:19769500kB, anon-rss:11622928kB, file-rss:884kB, shmem-rss:0kB

命令free -hl显示我有足够的内存。

              total        used        free      shared  buff/cache   available
Mem:           251G         10G         11G        227G        229G         12G
Low:           251G        240G         11G
High:            0B          0B          0B
Swap:           29G         29G          0B

同样如 所示ulimit -a,没有设置虚拟内存限制。

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 1030545
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1030545
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

这是我的 Centos 和内核的版本(由 输出hostnamectl):

hostnamectl
   Static hostname: localhost.localdomain
         Icon name: computer-server
           Chassis: server
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-514.26.2.el7.x86_64
      Architecture: x86-64

这里显示的内容cat /etc/security/limits.conf

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
* soft nofile 65536
* hard nofile 65536

#@intern    hard    as 162400000
#@intern    hard    nproc 150

# End of file

正如建议的那样,我更新了以下输出df -h

Filesystem            All  Used  Available (Used)% Mount
devtmpfs             126G     0  126G    0% /dev
tmpfs                126G  1.3M  126G    1% /dev/shm
tmpfs                126G  4.0G  122G    4% /run
tmpfs                126G     0  126G    0% /sys/fs/cgroup
/dev/mapper/cl-root  528G  271G  257G   52% /
/dev/sda1            492M  246M  246M   51% /boot
tmpfs                 26G     0   26G    0% /run/user/0
tmpfs                 26G     0   26G    0% /run/user/1002
tmpfs                 26G     0   26G    0% /run/user/1349
tmpfs                 26G     0   26G    0% /run/user/1855
ls -a /dev/shm/
.  ..
grep Shmem /proc/meminfo
Shmem:          238640272 kB

几个tmpfs成本126G内存。我正在用谷歌搜索这个,但仍然不确定应该怎么做?

那就是程序异常终止导致的共享内存问题。

ipcrm用于清除所有共享内存然后STAR running就可以了。

$ ipcrm
.....
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           251G         11G        226G        3.9G         14G        235G
Swap:           29G        382M         29G

标签: linuxout-of-memory

解决方案


看起来问题出在共享内存上:您有227G的内存被共享对象占用。

共享内存文件是持久的。查看/dev/shm任何其他tmpfs挂载,看看是否有可以删除的大文件以释放更多物理内存(RAM +交换)。

$ ls -l /dev/shm
...
$ df -h | grep '^Filesystem\|^tmpfs'
...

推荐阅读