现象描述

日志中出现报错信息 “fork:Cannot allocate memory”。如下图所示:

可能原因

可能是进程数超限导致。系统内部的总进程数达到了 pid_max 时,再创建新进程时会报 “fork:Cannot allocate memory” 错。

解决思路

  1. 参考 处理步骤,查看实例内存使用率是否过高。
  2. 核实总进程数是否超限,并修改总进程数 pid_max 配置。

处理步骤

1、执行以下命令,查看系统 pid_max 值。

sysctl  -a | grep pid_max

根据返回结果,进行对应操作:

1.1、返回结果如下图所示,pid_max 默认值为32768,请执行下一步。

1.2、返回报错信息 “fork:Cannot allocate memory”,则需执行以下命令,临时调大 pid_max

echo 42768 > /proc/sys/kernel/pid_max

您可再次执行命令,查看系统 pid_max 值。

2、执行以下命令,查看系统内部总进程数。

pstree -p | wc -l

若总进程数达到了 pid_max,则系统在创建新进程时会报 “fork Cannot allocate memory” 错。

您可执行 ps -efL 命令,定位启动进程较多的程序。

3、将 /etc/sysctl.conf 配置文件中的 kernel.pid_max 值修改为65535,以增加进程数。修改完成后如下图所示:

4、执行以下命令,使配置立即生效。

sysctl -p

现象描述

Linux 云服务器在内存使用率未占满的情况下触发了 OOM(Out Of Memory)。如下图所示:

可能原因

可能是由系统可用内存低于 min_free_kbytes 值导致。min_free_kbytes 值表示强制 Linux 系统最低保留的空闲内存(Kbytes),如果系统可用内存低于设定的 min_free_kbytes 值,则默认系统启动 oom-killer 或强制重启。具体行为由内核参数 vm.panic_on_oom 值决定:

  • 若 vm.panic_on_oom=0,则系统会提示 OOM,并启动 oom-killer 杀掉占用最高内存的进程。
  • 若 vm.panic_on_oom =1,则系统会自动重启。

解决思路

  1. 参考处理步骤进行排查,查看实例内存使用率是否过高及总进程数是否受限。
  2. 核实 min_free_kbytes 值设置,并修改为正确配置。

处理步骤

1、登录云服务器,执行以下命令查看 min_free_kbytes 值

sysctl -a | grep min_free

min_free_kbytes 值单位为 kbytes,下图所示 min_free_kbytes = 1024000 即为1GB。

2、执行以下命令,使用 VIM 编辑器打开 /etc/sysctl.conf 配置文件。

vim /etc/sysctl.conf

3、按 i 进入编辑模式,修改 vm.min_free_kbytes 配置项。若该配置项不存在,则直接在配置文件中增加即可。

*建议修改 vm.min_free_kbytes 值为不超过总内存的1%即可。

4、按 Esc 并输入 :wq 后,按 Enter 保存并退出 VIM 编辑器。

5、执行以下命令,使配置生效即可。

sysctl -p

1、备份现有源

sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak

2、一般情况下,将 /etc/apt/sources.list 文件中 Debian 默认的源地址 http://deb.debian.org/ 替换为国内源即可。

#中国科技大学
sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
#网易云163
sudo sed -i 's/deb.debian.org/mirrors.163.com/g' /etc/apt/sources.list
#阿里云
sudo sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
#清华同方
sudo sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

3、sudo apt-get update 更新索引以生效。

inux一键dd脚本支持Debian 9/10/11、Ubuntu 16.04/18.04/20.04、CentOS 7/8、RockyLinux 8和AlmaLinux 8系统的网络重装,自动适配境内境外系统源(境内使用阿里云,境外使用官方),适用于 GigsGigsCloud、AkkoCloud、GreenCloud和腾讯云等vps和云服务器。

使用命令:

wget -N --no-check-certificate https://down.vpsaff.net/linux/dd/network-reinstall-os.sh && \
chmod +x network-reinstall-os.sh && ./network-reinstall-os.sh

原文:https://www.idcoffer.com/archives/4870

现在很多云服务或vps都逐渐支持IPv6了,但是由于IPv6路由等原因,体验可能非常不好,需要禁用。

单网卡快速禁用IPv6脚本:

nic=$(ip route get 8.8.8.8 | grep dev | awk -F'dev' '{ print $2 }' | awk '{ print $1 }')
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf \
&& echo "net.ipv6.conf.$nic.disable_ipv6 = 1" >> /etc/sysctl.conf \
&& sysctl -p

COSFS 功能说明

COSFS 工具支持将对象存储(Cloud Object Storage,COS)存储桶挂载到本地,像使用本地文件系统一样直接操作腾讯云对象存储中的对象, COSFS 提供的主要功能包括:

  • 支持 POSIX 文件系统的大部分功能,如:文件读写、目录操作、链接操作、权限管理、uid/gid 管理等功能。
  • 大文件分块传输功能。
  • MD5 数据校验功能。
  • 将本机数据上传至 COS,建议使用 COS Migration 工具 或 COSCMD 工具。

局限性

COSFS 基于 S3FS 构建, 读取和写入操作都经过磁盘中转,仅适合挂载后对文件进行简单的管理,不支持本地文件系统的一些功能用法,性能方面也无法代替云硬盘 CBS 或文件存储 CFS。 需注意以下不适用的场景,例如:

  • 随机或者追加写文件会导致整个文件的下载以及重新上传,您可以使用与 Bucket 在同一个地域的 CVM 加速文件的上传下载。
  • 多个客户端挂载同一个 COS 存储桶时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等。
  • 文件/文件夹的 rename 操作不是原子的。
  • 元数据操作,例如 list directory,性能较差,因为需要远程访问 COS 服务器。
  • 不支持 hard link,不适合高并发读/写的场景。
  • 不可以同时在一个挂载点上挂载、和卸载文件。您可以先使用 cd 命令切换到其他目录,再对挂载点进行挂载、卸载操作。

使用环境

支持主流的 Ubuntu、CentOS、SUSE、macOS 系统。

安装方式

1、根据系统版本选择对应的安装包,目前支持的 Ubuntu 发行版包括 Ubuntu14.04、Ubuntu16.04、Ubuntu18.04、Ubuntu20.04。

#Ubuntu16.04
sudo wget https://cos-sdk-archive-1253960454.file.myqcloud.com/cosfs/v1.0.19/cosfs_1.0.19-ubuntu16.04_amd64.deb
#Ubuntu18.04
sudo wget https://cos-sdk-archive-1253960454.file.myqcloud.com/cosfs/v1.0.19/cosfs_1.0.19-ubuntu18.04_amd64.deb
#Ubuntu20.04
sudo wget https://cos-sdk-archive-1253960454.file.myqcloud.com/cosfs/v1.0.19/cosfs_1.0.19-ubuntu20.04_amd64.deb

2、安装

sudo dpkg -i cosfs_1.0.19-ubuntu16.04_amd64.deb

使用方法

1. 配置密钥文件

在文件/etc/passwd-cosfs中,写入您的存储桶名称(格式为 BucketName-APPID),以及该存储桶对应的 <SecretId> 和 <SecretKey>,三项之间使用半角冒号隔开。为了防止密钥泄露,COSFS 要求您将密钥文件的权限值设置为640,配置/etc/passwd-cosfs密钥文件的命令格式如下:

sudo su  # 切换到 root 身份,以修改 /etc/passwd-cosfs 文件;如果已经为 root 用户,无需执行该条命令。
echo <BucketName-APPID>:<SecretId>:<SecretKey> > /etc/passwd-cosfs
chmod 640 /etc/passwd-cosfs

说明:

您需要将 <> 的参数替换为您的信息。

  • <BucketName-APPID>为存储桶名称格式,关于存储桶命名规范,请参见 存储桶命名规范
  • <SecretId> 和 <SecretKey>为密钥信息,您可前往访问管理控制台的 云 API 密钥管理 中查看和创建。
  • 您也可以将密钥配置在文件 $HOME/.passwd-cosfs 中,或通过 -opasswd_file=[path] 指定密钥文件路径,同时您需要将密钥文件的权限值设置为600。

示例:

echo examplebucket-1250000000:AKIDHTVVaVR6e3****:PdkhT9e2rZCfy6**** > /etc/passwd-cosfs
chmod 640 /etc/passwd-cosfs

2. 运行工具

将密钥文件中配置的存储桶挂载到指定目录,可以使用如下命令行:

cosfs <BucketName-APPID> <MountPoint> -ourl=http://cos.<Region>.myqcloud.com -odbglevel=info -oallow_other

其中:

  • <MountPoint> 为本地挂载目录(例如/mnt)。
  • <Region> 为地域简称, 例如 ap-guangzhou 、 eu-frankfurt 等。更多地域简称信息,请参见 可用地域
  • -odbglevel 指定日志级别,默认为crit,可选值为crit、error、warn、info、debug。
  • -oallow_other 允许非挂载用户访问挂载文件夹。

示例:

mkdir -p /mnt/cosfs
cosfs examplebucket-1250000000 /mnt/cosfs -ourl=http://cos.ap-guangzhou.myqcloud.com -odbglevel=info -onoxattr -oallow_other

注意:

  • COSFS 工具为提升性能,默认使用系统盘存放上传、下载的临时缓存,文件关闭后会释放空间。在并发打开的文件数较多或者读写大文件的时候,COSFS 工具会尽量多的使用硬盘来提高性能,默认只保留 100MB 硬盘可用空间给其他程序使用,可以通过选项 oensure_diskfree=[size] 设置 COSFS 工具保留可用硬盘空间的大小,单位为 MB。例如-oensure_diskfree=1024,COSFS 工具会保留1024MB剩余空间。
  • V1.0.5及较早版本的 COSFS,挂载命令为 cosfs <APPID>:<BucketName> <MountPoint> -ourl=<CosDomainName> -oallow_other。

3. 卸载存储桶

卸载存储桶示例:

方式1:fusermount -u /mnt, fusermount 命令专用于卸载 FUSE 文件系统 
方式2:umount -l /mnt, 当有程序引用文件系统中文件时,进行卸载不会报错,并在没程序引用时完成卸载
方式3:umount /mnt, 当有程序引用文件系统中的文件时,进行卸载会报错

常用挂载选项

-omultipart_size=[size]

用来指定分块上传时单个分块的大小(单位: MB),默认是10MB。 由于分块上传对单个文件块的数目有最大限制(10000块),所以对于超出100GB(10MB * 10000)大小的文件,需要根据具体情况调整该参数。

-oallow_other

如果要允许其他用户访问挂载文件夹,可以在运行 COSFS 的时候指定该参数。

-odel_cache

默认情况下,COSFS 工具为了优化性能,在 umount 后,不会清除本地的缓存数据。 如果需要在 COSFS 退出时,自动清除缓存,可以在挂载时加入该选项。

-onoxattr

禁用 getattr/setxattr 功能,在1.0.9之前版本的 COSFS 不支持设置和获取扩展属性,如果在挂载时使用了 use_xattr 选项,可能会导致 mv 文件到 Bucket 失败。

-opasswd_file=[path]

该选项可以指定 COSFS 密钥文件的所在路径,该选项设定的密钥文件需要设置权限为600。

-odbglevel=[dbg|info|warn|err|crit]

设置 COSFS 日志记录级别,可选 info、dbg、warn、err 和 crit。生产环境中建议设置为 info,调试时可以设置为 dbg。如果您的系统日志,未定期清理且由于访问量很大,生成大量日志,您可以设置为 err 或者 crit。

-oumask=[perm]

该选项可以去除给定类型用户,对挂载目录内文件的操作权限。例如,-oumask=755,对应挂载目录的权限变为022。

-ouid=[uid]

该选项允许用户 ID 为 [uid] 的用户不受挂载目录中文件权限位的限制,可以访问挂载目录中的所有文件。
获取用户 uid 可以使用 ID 命令,格式id -u username。例如执行id -u user_00,可获取到用户 user_00 的 uid。

-oensure_diskfree=[size]

COSFS 工具为提升性能,默认使用系统盘存放上传、下载的临时缓存,文件关闭后会释放空间。在并发打开的文件数较多或者读写大文件的时候,COSFS 工具会尽量多的使用硬盘来提高性能,默认只保留 100MB 硬盘可用空间给其他程序使用,可以通过选项 oensure_diskfree=[size] 设置 COSFS 工具保留可用硬盘空间的大小,单位为 MB。例如-oensure_diskfree=1024,COSFS 工具会保留1024MB剩余空间。

如果docker run redis时,查看日志发现警告:

WARNING overcommit_memory is set to 0! Background save may fail under low memory cThe TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

需要在docker run后面加入 --sysctl net.core.somaxconn=1024,如:

docker run --restart=always --name=redis --sysctl net.core.somaxconn=1024 -d -v /etc/redis:/etc/redis -p 6379:6379 redis:alpine redis-server /etc/redis/redis.conf --appendonly yes

如果docker run redis时,查看日志发现警告:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

需要在服务器上执行 sysctl vm.overcommit_memory=1 或者执行一下语句:

echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf \
&& sysctl -p

sysbench是一款测试工具

主要包括以下几种方式的测试:

     1、cpu性能

     2、磁盘io性能

    3、调度程式性能

     4、内存分配及传输速度

     5、POSIX线程性能

     6、数据库性能(OLTP基准测试)现在sysbench主要支持 MySQL,pgsql,oracle 这3种数据库

安装

Debian/Ubuntu安装:

sudo apt-get install sysbench

CentOS/Fedora安装:

sudo yum install sysbench

如果提示“No match for argument: sysbench”,先执行:

yum -y install epel-release

然后在执行安装即可。


测试例子:

sysbench cpu --cpu-max-prime=20000 --threads=2 run

返回结果:

sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 2
Initializing random number generator from current time


Prime numbers limit: 20000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:   734.77

General statistics:
    total time:                          10.0015s
    total number of events:              7350

Latency (ms):
         min:                                    2.62
         avg:                                    2.72
         max:                                   35.68
         95th percentile:                        2.76
         sum:                                19993.60

Threads fairness:
    events (avg/stddev):           3675.0000/0.00
    execution time (avg/stddev):   9.9968/0.00

1、运行此命令下载Docker Compose的当前稳定版本:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2、给与docker compose执行权限

sudo chmod +x /usr/local/bin/docker-compose

3、创建连接,指向 /usr/bin

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4、测试安装结果

$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

如果出现 docker-compose: error while loading shared libraries: libz.so.1: failed to map segment from shared object: Operation not permitted 错误,执行:

mkdir $HOME/tmp
export TMPDIR=$HOME/tmp

为方便起见,创建目录后,可以将“export”语句放在shell 的配置文件中(例如:~/.bash_profile 或~/.bashrc)

alias docker-compose='TMPDIR=${HOME}/tmp docker-compose'