Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

Linux-环境配置

简介

记录一下Linux运维相关的学习资料;

Centos

安装完,可以直接将/etc/sysconfig/network-scripts/ifcfg-xxx此选项打开ONBOOT=yes。这样一般都能上网了。

Powerlevel10k

https://github.com/romkatv/powerlevel10k

安装字体

1
2
3
4
5
6
7
8
9
10
11
12
git clone https://github.com/ryanoasis/nerd-fonts.git --depth 1
cd nerd-fonts
chmod +x install.sh
./install.sh
git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
vim ~/.zshrc
ZSH_THEME="powerlevel10k/powerlevel10k"
POWERLEVEL9K_MODE="awesome-patched"
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
plugins=(git
zsh-autosuggestions
)

使用这个主题,速度会非常快;

EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.如果不安装这个库,将会少了很多的软件包。yum -y install epel-release

可以安装一下zshautojumpautojump-zshoh-my-zsh。自从2019年之后,mac就默认使用zsh代替了bash

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装zshyum install -y zsh;查看shell类型echo $SHELL;切换默认的shell类型chsh -s /bin/zsh

安装了zsh之后,可以通过执行chsh来设置成默认的shell。安装完成之后xshell工具的home键无法使用。可以通过在zshrc文件里面添加这些内容。

zsh插件

1
2
3
4
5
6
# bindkey '\e[1~' beginning-of-line
# bindkey '\e[4~' end-of-line
cd ./.oh-my-zsh/custom/plugins
git clone git://github.com/wting/autojump.git
cd autojump
./install.py or ./uninstall.py

参考文档home-end-keys-in-zsh-dont-work-with-putty

有时候会升级失败,这个还是由于git访问不流畅造成。

  1. 先将本地的oh my zsh目录找到,通过git pull直接拉取最新的版本;
  2. 执行这个指令 upgrade_oh_my_zsh 就能将版本升级好了。

常用的软件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
yum install -y wget git screen libtool automake
yum install zlib-devel -y
yum install centos-release-scl -y
yum makecache
yum install devtoolset-7-gcc-c++ -y
yum install llvm-toolset-7.0-y
yum install cmake -y
yum install python3-devel
yum install curl-devel mariadb-devel.i686

# 安装man
yum install man-pages man-db man

# c++ 帮助文件
yum install man-pages libstdc++-docs

# 网路分析工具
yum install tcpdump

# 安装gcc调试信息
debuginfo-install gcc
# 最后能切换gcc版本:
scl enable llvm-toolset-7 devtoolset-7 bash
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
pip install shadowsocks
yum install mariadb-libs
yum install mariadb-devel
yum install mariadb-server
systemctl start mariadb
systemctl enable mariadb

# 通过命令查看版本
yum info cmake

# 切换脚本,如果不想用了,可以将这个从
/etc/bashrc/profile
# 文件
source /opt/rh/llvm-toolset-7/enable
source /opt/rh/devtoolset-7/enable

查看机器版本信息
# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.8.2003 (Core)
Release: 7.8.2003
Codename: Core


# 查看服务器的cpu情况
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
10 Intel(R) Xeon(R) CPU E5-2430 v4 @ 2.10GHz

1. 命令行方式登陆
systemctl set-default multi-user.target
2. 图形化界面登陆
systemctl set-default graphical.target

man帮助文件的章节意义

1
2
3
4
5
6
7
8
9
10
11
The section numbers of the manual pages are as follows:

1 – Executable programs or shell commands
2 – System calls (functions provided by the kernel)
3 – Library calls (functions within program libraries)
4 – Special files (usually found in /dev)
5 – File formats and conventions eg /etc/passwd
6 – Games
7 – Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 – System administration commands (usually only for root)
9 – Kernel routines [Non standard]

centos 7防火墙

检查防火墙状态

1
2
firewall-cmd --list-all
firewall-cmd --state

禁用随系统启动防火墙

1
systemctl disable firewalld

启用随系统启动防火墙

1
systemctl enable firewalld

关闭防火墙

1
systemctl stop firewalld

当前防火墙服务状态

1
systemctl status firewalld

永久开放防火墙端口

1
2
firewall-cmd --permanent --zone=public --add-port=52310-52320/tcp 
sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent

重新加载防火墙规则

1
sudo firewall-cmd --reload

netcat 尝试端口连接

使用tcp4方式连接一个ip地址的端口

1
2
3
4
5
6
7
8
9
10
11
12
nc -4 ip_address port
# 示例:
[root@test-01 ~]# nc -4 127.0.0.1 22 -v
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH_7.4
nc --help
See the ncat(1) manpage for full options, descriptions and usage examples
man ncat
Ncat 7.50 ( https://nmap.org/ncat )

nc -zv 127.0.0.1 9100
Connection to 127.0.0.1 9100 port [tcp/jetdirect] succeeded!

在帮助文件里面可以获取更多的信息。

1
2
3
4
5
6
7
8
9
10
       Connect to example.org on TCP port 8080.
ncat example.org 8080

Listen for connections on TCP port 8080.
ncat -l 8080

nc -l 10010
# nc -vv -w 5 xxx.xxx.xxx.xxx 10011-10010
nc: connect to xxx.xxx.xxx.xxx port 10010 (tcp) failed: Connection timed out
Connection to xxx.xxx.xxx.xxx 10011 port [tcp/*] succeeded!

检查端口情况

1
netstat -tnlp

检查当前

LNMP

在centos中一般直接使用套件来安装。

LNMP

LNMP-Home

Linux系统设置

批量设置环境变量

https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs

.env

1
2
AA=xxx
BB=bbb

env $(cat .env | xargs) rails

修改时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

locale设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@vm10-0-2-2 raw_database]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

如果发现有问题,可以通过在/etc/profile文件中添加

1
2
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

检查coredump的配置

1
2
# 查看coredump信息
cat /proc/sys/kernel/core_pattern

一般我们将coredump文件生成目录重定向到一个固定的地方:

1
2
3
mkdir -p /data/cores/
chmod a+w /data/cores/ -R
echo "/home/cores/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

设置ulimit

1
2
3
4
5
6
7
8
9
10
ulimit -n 65535
ulimit -c unlimited

# 直接修改这个文件,在这个文件尾部放入3行
vi /etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535
* soft core unlimited

centos yum proxy

1
2
3
4
5
/etc/yum.conf
proxy=http://代理服务器IP地址:端口号
proxy=http://代理服务器IP地址:端口号
proxy_username=代理服务器用户名
proxy_password=代理服务器密码

centos安装python3.6

softwarecollections-下载网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. Install a package with repository for your system:
# On CentOS, install package centos-release-scl available in CentOS repository
# and enable the testing repository:
$ sudo yum install centos-release-scl
$ sudo yum-config-manager --enable centos-sclo-rh-testing

# On RHEL, enable RHSCL and RHSCL-beta repositories for you system:
$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms
$ sudo yum-config-manager --enable rhel-server-rhscl-beta-7-rpms

# 2. Install the collection:
$ sudo yum install rh-python36

# 3. Start using software collections:
$ scl enable rh-python36 bash

遇到过的报错

1
Error: ENOSPC:System limit for number of file watchers reached

这个错误的意思时系统对文件监控的数量已经到达限制数量了!!

造成的结果: 执行的命令失败!或抛出警告(比如执行 react-native start 或者打开 vsocde)

解决方法:

修改系统监控文件数量

Ubuntu

1
2
3
4
5
sudo vim /etc/sysctl.conf
最后加入
fs.inotify.max_user_watches=524288
搞定
sudo sysctl -p

ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
sudo apt-get update && apt-get upgrade
sudo apt-get install mariadb-server -y
sudo apt-get install unzip -y
sudo apt-get install zlib1g-dev -y
sudo apt-get install libmariadbclient-dev -y
sudo apt install p7zip-full -y
sudo apt install -y "screen"
sudo apt install clang-format -y
sudo apt-get install gcc-7 g++-7 -y
sudo apt-get install clang cmake unzip screen clang-format mariadb-server unzip golang python3-pip automake -y
sudo apt-get install git libmariadbclient-dev p7zip-full openssl -y
sudo apt-get install nodejs -y
sudo apt-get install gdb -y

apt update
sudo apt update
sudo apt upgrade
sudo apt install build-essential ccache dos2unix autoconf manpages-dev glibc-doc libstdc++-10-doc \
unzip clangd -y
apt -y install mariadb-server mariadb-client libmysqlclient-dev
apt install libmysqlclient-dev

# libstdc++-10-doc This package contains documentation files for the GNU stdc++ library.

# screen 无法使用的问题,其实就是重定向一下 screen 的工作目录就好了
Cannot make directory '/run/screen': Permission denied
export SCREENDIR=$HOME/.screen
abel@xiaozanbiao:~/learn/c++/octopus_svr/octopus_svr/build$ screen -S abel
Directory /home/abel/.screen must have mode 700.
abel@xiaozanbiao:~/learn/c++/octopus_svr/octopus_svr/build$ chmod 700 ~/.screen/
abel@xiaozanbiao:~/learn/c++/octopus_svr/octopus_svr/build$ screen -S abel

# screen 无法滚动的问题

在使用 screen 命令创建了一个窗口后,你可以使用 Ctrl+a 和 Esc 进入「复制模式」,此时可以使用方向键或 PageUp/PageDown 键来滚动屏幕内容,也可以使用鼠标进行滚动。在复制模式下,你可以查看已经滚动到屏幕外的内容。

如果你想直接查看已经滚动到屏幕外的内容而不进入复制模式,可以使用 Ctrl+a 和 ] 进入「回滚模式」。在回滚模式下,你可以使用方向键或 PageUp/PageDown 键来滚动屏幕内容,而当前窗口中的内容不会被清除。如果你想回到正常模式,可以使用 Ctrl+a 和 Ctrl+l 或输入 clear 命令清空屏幕。

使用 GNU Screen 工具可以在终端中进行多窗口分屏。以下是一些基本的 GNU Screen 使用方法:

安装 GNU Screen: 如果你的系统中尚未安装 GNU Screen,你可以使用系统包管理器进行安装。例如,在 Ubuntu 上,可以使用以下命令安装:


sudo apt-get install screen

启动 GNU Screen: 在终端中输入 screen 命令启动 GNU Screen 会话:

分屏: 按下 Ctrl + A 然后按下 |(竖线符号)来进行垂直分屏,按下 Ctrl + A 然后按下 S 来进行水平分屏。

切换窗口: 按下 Ctrl + A 然后按下 Tab 或者按下 Ctrl + A 然后按下方向键来切换窗口。

关闭窗口: 在要关闭的窗口中按下 Ctrl + D。

退出 GNU Screen: 在所有窗口都关闭后,可以按下 Ctrl + A 然后按下 K 或者直接关闭终端来退出 GNU Screen。

这些是 GNU Screen 的一些基本用法。你可以根据需要在屏幕上创建多个窗口,方便在同一终端中进行多个任务。

方法 2: 修改已运行的 screen 会话的名称

如果你已经在 screen 会话中,并且想修改当前会话的名称,可以按以下步骤操作:

1. 进入 screen 会话。
2. 按 Ctrl + a,然后按 A(注意大小写),屏幕底部会提示你输入新的会话名称。
3. 输入新的名称并按回车。

方法 3: 使用命令修改名称

你还可以通过命令直接在 screen 会话中修改名称:

1. 在 screen 会话中按 Ctrl + a。
2. 然后输入以下命令(不用按回车):

# 2020/12/18 添加一个命令,记录当前某个进程的cpu,内存情况;
sudo apt install sysstat

#!/bin/bash
prog_name="your_programe_name"
prog_mem=$(pidstat -r -u -h -C $prog_name |awk 'NR==4{print $12}')
time=$(date "+%Y-%m-%d %H:%M:%S")
echo $time"\tmemory(Byte)\t"$prog_mem >>~/record/prog_mem.log

# 抓取某个进程的内存使用情况;
# 每2秒钟检测一次,持续5秒
$ pidstat -r -u -h -C Level 2 5

# CentOS7 如何升级Git

# 启用Wandisco GIT存储库,在此之前我们先写入新yum存储库配置文件,在终端输入:
vim /etc/yum.repos.d/wandisco-git.repo

[wandisco-git]
name=Wandisco GIT Repository
baseurl=http://opensource.wandisco.com/centos/7/git/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

# 导入存储库GPG密钥
rpm --import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

# 安装 nvm
sudo apt install curl
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash

# 能方位github的话,使用这条命令
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

# 不能访问github的话, 可以用下面这条
curl -o- https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh | bash

# 然后执行下面的两条命令即可
chmod +x ~/.nvm/nvm.sh
source ~/.bashrc

# 安装:

yum install git


# 安装文档输出;

sudo apt install graphviz

apt 相关知识

使用apt-get查询安装指定版本的软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apt-cache show libjemalloc-dev
Package: libjemalloc-dev
Architecture: amd64
Version: 5.2.1-1ubuntu1
Priority: extra
Section: universe/libdevel
Source: jemalloc
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Faidon Liambotis <paravoid@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 2748
Depends: libjemalloc2 (= 5.2.1-1ubuntu1)
Suggests: binutils
Filename: pool/universe/j/jemalloc/libjemalloc-dev_5.2.1-1ubuntu1_amd64.deb
Size: 424588
MD5sum: f519936da1e4557812ebad9cbf9e1029
SHA1: 2e5e464c4c2f051b7f32ed44a805bd7f08ec3738
SHA256: c5d64ba693ad45dd7c41f1d103a74816482601f7d0272ed49fc5441e9e1deb91
Homepage: http://jemalloc.net/
Description-en: development files and documentation for jemalloc
Files used for development with jemalloc. This package contains
headers and documentation.
.
jemalloc is a library providing a malloc(3) implementation for
multi-threaded processes on multi-processor systems.
Description-md5: f91b42ea17991369b6b9cd46f2828e3f

man 帮助文件安装

Linux下完整安装 manpages

1
2
3
4
5
sudo apt-get install linux-doc
sudo apt-get install libcorelinux-dev
sudo apt-get install libstdc++-7-dev
sudo apt-get install libstdc++-7-doc
sudo apt-get install manpages*

安装g++-11

ubuntu-g++-11

1
2
3
4
5
6
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt install -y g++-11

sudo apt purge --autoremove -y g++-11
sudo rm -rf /etc/apt/trusted.gpg.d/ubuntu-toolchain-r_ubuntu_test.gpg
sudo rm -rf /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-focal.list

mysql

权限相关

安装完成之后,需要做一些简单的处理,防止安全问题。mysql最后限制访问的ip地址,给指定的ip地址开放访问的独立的密码。

1
2
3
GRANT ALL PRIVILEGES ON *.* TO 'root'@'ip_address' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

使用这个命令将处理掉mysql的一些安全问题。

1
mysql_secure_installation

mysql 8.0 版本 root 密码修改

需要执行

1
flush privileges;

然后再执行

1
2
3
ALTER user 'root'@'localhost' IDENTIFIED BY 'root';--修改密码为root
create user if not exists 'root'@'%' identified by '123456';
GRANT ALL ON gamedata005.* TO 'root'@'%';

MySQL8.0手册

备份数据库

将某个数据库导出,不需要导出数据

1
mysqldump --no-create-db=TRUE --no-data=TRUE -h"ip_address" -uroot -pyourpassword gamedb_10001 > gamedb_10001.sql

具体参数可以通过mysqldump —help中看到。

直接创建数据库

1
mysql -h"ip_address" -uroot -pyourpassword -e "create database gamedb_30001"

将数据表创建到新库中

1
mysql -h"ip_address" -uroot -pyourpassword gamedb_30001 < gamedb_10001.sql

cygwin多次grep没有输出

在.bashrc文件里面增加这一句:

1
alias grep='grep --color --line-buffer'                     # show differences in colour

发现grep失效,无法做正确输出。google研究了一下,原因如下:

管道 | 是全缓冲的,一般来说buffer_size为4096,有些是8192。不管具体值多少,只有buffer_size满了,才会看到输出。

在操作里 >>file 这个操作也是全缓冲的。调整如下

tail -f log | grep —line-buffer xxx | grep —line-buffer yyy

结果输出正常。

grep当带上了 —line-buffer 的时候,每输出一行,就刷新一次。

在unix里,块设备和普通文件,以及管道都是全缓冲的。

ubuntu无法更新

1
The following packages have unmet dependencies

后来我把阿里源换回Ubuntu原生的源就可以安装了,因为阿里源的包太新。转载原文

WSL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# WSL-Ubuntu18.04 LTS 重启方法
# 以管理员权限运行cmd
>net stop LxssManager //停止
>net start LxssManager //启动

# 将WSL搬家
# 首先查看所有分发版本
> wsl -l --all -v
# 导出分发版为tar文件到d盘
> wsl --export Ubuntu-20.04 d:\ubuntu20.04.tar
# 注销当前分发版
> wsl --unregister Ubuntu-20.04
# 重新导入并安装分发版在d:\ubuntu
wsl --import Ubuntu-20.04 d:\ubuntu d:\ubuntu20.04.tar --version 2
# 设置默认登陆用户为安装时用户名
ubuntu2004 config --default-user Username
# 删除tar文件(可选)
del d:\ubuntu20.04.tar
# 这个操作,完成之后我的WSL也从1升级到2了。
# 升级了之后,WSL完全拥有独立的ip地址;

# 强制指定启动的账号
echo -e "[user]\ndefault=oduser" >> /etc/wsl.conf

# Windows update 之后发现如果 wsl 无法启动了,可以执行这个
netsh winsock reset
1
2
3
4
Linux找出全部可执行文件,并且删除掉。
ls -F|grep '*' | sed 's#*##g' | xargs rm
参考网站: https://www.cnblogs.com/binyue/p/4707948.html

GPG生成

1
2
3
We need to generate a lot of random bytes
# 通过 yum install rng-tools完成安装。
# 之后再执行命令:rngd -r /dev/urandom,生成**就能瞬间完成了。

查看进程启动时间运行时间

lstart STARTED time the command started. See also bsdstart, start, start_time, and stime.
etime ELAPSED elapsed time since the process was started, in the form [[DD-]hh:]mm:ss.

1
2
ps -eo pid,lstart,etime,cmd | grep java
14728 Tue Sep 28 18:01:10 2021 14-16:23:46 /usr/lib/jvm/java-7-openjdk-amd64/bin/java -Dzookeeper.log.dir

手动清理内存

1
2
3
# 在crontab里面每隔5分钟清理一次
*/5 * * * * echo 3 > /proc/sys/vm/drop_caches
# select-editor 可以修改编辑器

htop减少重复的进程

1
2
3
按F2
选择 Display options
选择 Hide userland threads

文件监视限制上限

1
2
3
4
5
6
7
8
9
# Error: ENOSPC: System limit for number of file watchers reached

cat /proc/sys/fs/inotify/max_user_watch
# 临时增加
sudo sysctl fs.inotify.max_user_watches=524288
sudo sysctl -p
# 永久增加
echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

wsl

导入之后默认账号需要切换成自己想要的:

superuser-提供的方案

1
2
3
4
5
6
7
8
9
10
Method 1 - /etc/wsl.conf
The current Microsoft recommended way of setting the username in an instance is to create a /etc/wsl.conf in the instance with the following setting:

[user]
default=username
Changing, of course, username to be your default username.

Exit your distro/instance, then issue a wsl --terminate <distroname> from PowerShell or CMD. When you restart, the default user should be set.

This is safer and less error-prone than the registry-based methods.

记录两款远程桌面工具

rustdesk
todesk

1
2
3
4
5
6
7
8
9
sudo apt-get purge openssh-server # wsl2 自带的好像 sshd 不完整,先删除掉
sudo apt-get install openssh-server # 重新安装
sudo vi /etc/ssh/sshd_config
把你的 sshd_config PasswordAuthentication 参数改为和下图一致
PasswordAuthentication no
sudo service ssh restart
service docker start
sleep 2
sudo chmod 666 /var/run/docker.sock

frp

推荐使用这个透传;

将本地服务器gogs的3000转发出去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 服务器配置
# 就是由于用了http方式来做,反而出问题了。
frps error: type [http] not support when vhost_http_port is not set

[common]
bind_port=3007
#vhost_http_port=3008 #当代理出来的是web服务时,在外网访问http://vps的IP:7001
#这两个字段都不要填写,反而是正确的
#vhost_https_port = 3010
#dashboard_port状态以及代理统计信息展示,网址:7500可查看详情
dashboard_port=3009
#dashboard_user访问用户dashboard_pwd访问密码
dashboard_user = admin
dashboard_pwd = 你自己的密码
#log_file日志文件log_level记录的日志级别log_max_days日志留存3天authentication_timeout超时时间
log_file = ./frps.log
log_level = info
log_max_days = 3
authentication_timeout = 0
#max_pool_count最大链接池,每个代理预先与后端服务器建立起指定数量的最大链接数
max_pool_count = 50

# 客户端配置
[common]
server_addr = 你的服务器ip地址
server_port = 3007 # 和这个对齐bind_port

[ssh]
type = tcp
local_ip=127.0.0.1
local_port = 3008
remote_port=3008

zeronet n2n

去中心化通讯。

neovim

Neovim

ubuntu安装 g++ 11

1
2
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt install -y g++-11

htop

htop-H
htop-F2

btop

btop更加多的信息可以查看;

通过指令看apt安装到什么目录了

1
dpkg-query -L libssl-dev | grep -E 'openssl\/.+\.h$'

iperf

可以通过这个工具来测试网路情况。

1
2
3
参数说明
-s 以server模式启动,eg:iperf -s
-c host 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23

内存清理

1
echo 3 > /proc/sys/vm/drop_caches

bash工具

bash-editors

科学上网

科学上网1

科学上网2

科学上网3

科学上网4

对比工具-替换掉之前的-beyond-compare

winmerge

pgadmin

pgadmin

go attach debug fail

1
sudo echo "0"|sudo tee /proc/sys/kernel/yama/ptrace_scope

mac-multiple-account-github.com

mac-multiple-account-github.com

mac打开文件夹

For Mac users, press Command+Shift+G to open the prompt for path input.

通过这个快捷键,直接打开输入地址栏;

阿里云服务器升级硬盘

升级阿里云的硬盘

1
2
3
4
5
6
7
8
9
10
11
# 查看是否已经分配了
fdisk -lu
# 查看硬盘情况
df -Th
# 安装升级软件
apt-get update
apt-get install -y cloud-guest-utils
# 注意这里面有个空格
growpart /dev/vda 1
# 开始扩容
resize2fs /dev/vda1

aws扩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 0 100% /snap/core20/2105
loop1 0 100% /snap/amazon-ssm-agent/7628
loop2 0 100% /snap/core18/2812
loop3 0 100% /snap/lxd/26881
loop4 0 100% /snap/snapd/20671
nvme0n1
├─nvme0n1p1 ext4 1.0 cloudimg-rootfs 1127d3f4-3de6-4e02-8705-713269caf74d 111.5G 42% /
├─nvme0n1p14
└─nvme0n1p15 vfat FAT32 UEFI 2D7D-66A4 98.3M 6% /boot/efi
xxx# growpart /dev/nvme0n1 1
CHANGED: partition=1 start=227328 old: size=419203039 end=419430367 new: size=524060639 end=524287967
xxx# resize2fs /dev/nvme0n1p1
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/nvme0n1p1 is mounted on /; on-line resizing required
old_desc_blocks = 25, new_desc_blocks = 32
The filesystem on /dev/nvme0n1p1 is now 65507579 (4k) blocks long.
xxx# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 243G 83G 160G 34% /

参考资料

阿里云格式化硬盘添加硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
fdisk -l --bytes
# 开始格式化
fdisk /dev/vdb
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x659849d9.

Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2147483647, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2147483647, default 2147483647):

Created a new partition 1 of type 'Linux' and of size 1024 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

# 格式化这个盘
root@iZuf60cqo2x41m4bfri53eZ:/home/ecs-user# mkfs.ext4 /dev/vdb1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 268435200 4k blocks and 67108864 inodes
Filesystem UUID: 51600195-f027-495d-a60a-d1ebe20b94a6
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
# 临时挂载
mount /dev/vdb1 /data
# 格式化完成之后查看
df -h
/dev/vdb1 1007G 28K 956G 1% /data
# 永久挂载
echo '/dev/vdb1 /data ext4 defaults 0 0' >> /etc/fstab
1
2
3
4
5
6
7
8
sudo mkdir /bsc
如果没有格式化,就回遇到这样的麻烦
mount /dev/vdb1 /bsc
mount: /bsc: wrong fs type, bad option, bad superblock on /dev/vdb1, missing codepage or helper program, or other error.

https://blog.csdn.net/weixin_52903283/article/details/129045385
没有格式化造成的
mkfs -t ext4 /dev/vdb1

使用权限

需要将key文件设置成 600,之前是0644权限;

1
2
3
4
5
6
7
8
9
10
11
12
13
Permissions 0644 for '/Users/xxx/.ssh/xxxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxx/.ssh/xxxx.pem": bad permissions
xxxr@xxx.xxx.xxx.xxx: Permission denied (publickey).
```bash
docker pull postgres
docker run --name postgres \
--restart=always \
-e POSTGRES_PASSWORD=123456 \
-p 5432:5432 \
-v /data/postgresql:/var/lib/postgresql/data \
-d postgres

ai语言

1
Microsoft Azure XiaochenNeural

export 的时候发现了报错

1
2
export: not valid in this context
由于当时安装 zsh 出现的问题。

netstat

1
2
3
4
5
6
7
8
9
10
11
12
13
netstat Recv-Q
今天发现了某个端口没有响应了,通过netstat看,这个端口里面积攒了很多数据没有被处理。后面才知道go/gin写的一个服务把主线程阻塞了,造成了各种问题。

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 312 0 :::6010 :::* LISTEN 2447694/./wall

这里面其实就是说有312个字节从内核送到了用户态,但是用户态没有处理,后面还发现自己的很多服务器都处在僵尸状态 defunct

ps -e -o stat,ppid,pid,cmd | egrep '^[Zz]'
通过这个指令可以调出全部的僵尸进程,一般都需要关闭掉父进程
parent process id
sh ./start.sh
由于我们这个程序是通过一个脚本来启动的,所以最终还是找到脚本把它kill掉就好了。

统计日志里面重复选项

1
awk '{print $6}' ./logs/log.log | sort | uniq -c | sort -k1n

mac

Mac快捷键

1
2
3
4
5
6
7
8
9
# 切换相同应用下的程序
command+`
# 将表情符号调出来
ctrl+command+space =
# 翻页键
opt+↑|↓
fun+↑|↓
# finder里面进入一个目录
command+o

android投放文件给mac

localsend

chmod的意思

chmod是一个Linux/Unix命令,用于更改文件或目录的权限。其中,777是一种权限设置,表示所有用户都有读、写和执行的权限。具体来说,7表示所有者的权限,7表示组的权限,7表示其他用户的权限。每个数字都可以用二进制表示,例如7可以表示为111,其中1表示有权限,0表示没有权限。因此,777可以表示为111111111,即所有用户都有读、写和执行的权限。包括读、写和执行权限。

使用 linux 生成 key

在 Linux 中,可以使用以下命令生成高强度的密钥对:

1
ssh-keygen -t rsa -b 4096

该命令将生成一个 4096 位的 RSA 密钥对,并将其保存在默认位置 (~/.ssh/id_rsa) 和 (~/.ssh/id_rsa.pub)。可以使用以下命令来生成其他类型的密钥对,例如DSA和ECDSA:

1
2
3
4
5
6
ssh-keygen -t dsa -b 2048  -C "这里可以取名字"
ssh-keygen -t ecdsa -b 256 -C "这里可以取名字"
# ED25519是一种基于椭圆曲线密码学的公钥算法
ssh-keygen -t ed25519 -C "这里可以取名字"
生成的pub文件放到之类:
~/.ssh/authorized_keys

在生成密钥对时,请注意以下几点:

  • 不要使用弱密码来保护私钥。
  • 不要将私钥泄露给其他人。
  • 不要在不必要的情况下将密钥对导出到文件中。
  • 定期更新私钥以防止被盗。

可以使用 -C 参数来指定注释信息,例如:

1
ssh-keygen -t ed25519 -C "my comment"

ED25519是一种基于椭圆曲线密码学的公钥算法,它被广泛应用于SSHv2协议中。相对于传统的RSA算法,ED25519具有更高的安全性和加解密速度,因此被认为是一种比较安全的密钥格式。

ED25519曲线选择方案有很多,推荐方案为Curve25519,其具有以下特点:

  • 安全性:对于对称密钥,Curve25519的安全性相当于256位AES。
  • 速度:由于Curve25519的数学特性,其加解密速度比RSA更快,尤其在小型设备上。
  • 长度:相对于RSA密钥对,ED25519密钥对的长度更短,节省了密钥交换时的网络传输时间和空间。
  • 综上所述,ED25519在SSHv2协议中是一种比较安全和高效的密钥格式。但是,选择密钥格式时需注意私钥的保护和管理,确保其安全性。

tree

可以安装一个 tree 命令按照树形输出目录里面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ tree -L 3 ./
./
└── bhpc
├── wallet
│ ├── chainnode
│ ├── crontab
│ ├── gateway
│ ├── riskserver
│ └── walletserver
└── wallet-admin
├── build.sh
├── chain
├── common
├── conf
├── config
├── controller
├── doc
├── main.go
├── model
├── package.json
├── README.md
├── router
└── vendor

如何区分 ubuntu|centos

1
2
3
4
# ubuntu
cat /etc/lsb-release
# centos
cat /etc/centos-release

Linux 如何创建 service

在Linux中,可以使用systemd工具来创建和管理服务(service)。以下是创建服务的的基本步骤:

  1. 创建服务单元文件:在/etc/systemd/system目录下创建一个服务单元文件,例如myservice.service。
  2. 编辑服务单元文件:使用文本编辑器打开服务单元文件,并按照以下格式编辑:
1
2
3
4
5
6
7
8
9
10
11
[Unit]  
Description=My Service
After=network.target

[Service]
Type=simple
ExecStart=/path/to/my/service
Restart=always

[Install]
WantedBy=multi-user.target

其中,Description字段是服务的描述信息;After字段指定服务启动的依赖项;Service字段指定服务的相关配置,如启动类型、命令路径、环境变量等;Install字段指定服务如何安装和启动。

  1. 重新加载systemd:执行systemctl daemon-reload命令,使systemd重新加载配置文件。
  2. 启动服务:执行systemctl start myservice命令,启动服务。
  3. 检查服务状态:执行systemctl status myservice命令,检查服务的状态。
  4. 添加服务到启动项:执行systemctl enable myservice命令,将服务添加到系统启动项中。
    完成以上步骤后,您的服务就会在系统启动时自动启动,并且可以在需要时手动启动和停止。

常用命令

1
2
3
4
5
systemctl [status|start|stop|enable] myservice
# 查看日志
journalctl -u myservice -f
# 重新加载配置
systemctl daemon-reload

编译的时候发现问题

flag-provided-but-not-defined

1
https://github.com/pingcap/tidb/issues/8955

出问题还是来自于我设置了这个环境变量。这样造成了问题,如果一个库编译的时候,需要使用到某个特定的库,应该是在本工程里面设置就好了。不要在.zshrc文件里面设置,否则会出现一些问题。

LDFLAGS

如何获取当前机器的internet出口

1
2
curl ifconfig.me
curl icanhazip.com

安装roguelike游戏

sudo apt-get install bsdgames-nonfree

用户管理

1
2
3
4
5
6
7
8
9
useradd -s /bin/bash -m <用户名称>

# 将用户增加sudo的权限
sudo usermod -aG sudo 新用户名

# 新增key信息。

~/.ssh/authorized_keys

Linux useradd 命令

aria2

下载工具;

https://aria2.github.io/

1
2
3
4
yum install epel-release -y
yum install aria2 -y

aria2c -o <save-file-name> -s14 -x14 -k100M <download-url>

tar.zst 文件

参考

1
2
yum install zstd
tar -I zstd -xvf archive.tar.zst

检查网络

1
traceroute www.baidu.com

如何查看

引用

如何使用 strace

strace -c -p PID -tt

等监控一段时间之后,ctrl+c取消掉,就能看到报告。

vscode 链接之后报错

1
2
3
__vsc_prompt_cmd_original: command not found

https://blog.csdn.net/qq_44949985/article/details/128902944

sha256

sha256sum ./filename.xxxx

tar.lz

解压缩

tar.lz

sudo apt-get install tar
sudo apt-get install lzip

tar —lzip -xvf your_file.tar.lz

systemctl 常用的方式

1
2
# 在这个里面能找到全部服务器里面的这些服务
/etc/systemd/system/

asdf 工具

1
2
asdf plugin add elixir
asdf plugin add nodejs

测试硬盘的读写速度

1
2
3
4
5
6
7
8
root@ip-10-58-194-127:/data# dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 8.76003 s, 123 MB/s
root@ip-10-58-194-127:/data# dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.193984 s, 5.5 GB/s

ncdu 工具

ncdu 是一个用于在终端中以交互方式浏览磁盘使用情况的命令行工具。ncdu 的全称是 “NCurses Disk Usage”,它使用 ncurses 库提供了一个基于文本的图形用户界面,让你可以直观地查看和管理文件系统上的磁盘空间。

1
2
sudo apt-get install ncdu    # For Debian/Ubuntu
sudo yum install ncdu # For CentOS/RHEL

ncdu

使用 watch 命令行监视 程序是否还在跑

在Linux中,如果你想要每隔固定时间(比如3秒)执行某个指令,并且将结果实时显示在控制台上,而不使用crontab,你可以使用watch命令。watch命令可以让你周期性地执行一个程序,并全屏显示执行结果。这非常适用于周期性地查看命令输出的场景。

1
2
watch -n 秒数 要执行的指令
watch -n 3 supervisorctl status

普通用户授权了 sudo 权限但是还是需要输入密码

要给 Linux 普通用户授权管理员权限,并且在使用 sudo 命令时无需输入密码,可以通过编辑 sudoers 文件来实现。以下是具体步骤:

以管理员身份编辑 sudoers 文件: 在终端中以管理员身份(root)使用文本编辑器打开 sudoers 文件。常用的编辑器有 vim、nano 等。例如:

1
sudo visudo

添加授权条目: 在打开的 sudoers 文件中,找到 %sudo 行,然后在其下面添加一行以授予管理员权限并允许无密码使用 sudo 命令。例如,如果要授权用户名为 username 的用户,添加如下行:

1
username ALL=(ALL) NOPASSWD: ALL

这行的含义是:允许用户名为 username 的用户在任何主机上以任何用户身份(包括 root)运行任何命令,而且不需要输入密码。

保存并退出: 保存对 sudoers 文件的更改并退出编辑器。

测试配置: 退出当前用户,然后以 username 用户身份登录,并尝试使用 sudo 命令执行一些需要管理员权限的操作,确保无需输入密码即可执行。

请注意,修改 sudoers 文件是一个敏感操作,不当的修改可能会导致系统安全问题。建议在编辑 sudoers 文件之前备份,并确保只授予必要的权限。

是的,你可以使用以下命令来在使用 sudo visudo 时指定 vim 作为编辑器:

1
sudo EDITOR=vim visudo

这样就会使用 vim 作为 sudoers 文件的编辑器。

redis端口转发

你可以使用 socat 命令在 Linux 命令行上实现端口转发。以下是使用 socat 命令将本地端口 42561 转发到 Redis 的 192.168.0.141:5789 的示例命令:

1
2
3
4
socat TCP-LISTEN:42561,fork TCP:xxx.xxx.xxx.xxx:3362
# 要在 Ubuntu 上安装 socat,你可以使用 apt 包管理器来进行安装。打开终端,然后运行以下命令:
sudo apt update
sudo apt install socat

可以直接使用supervisor来做成看护器;

通过ssh将远程端口映射成本地机器的端口

可以使用 SSH 的端口转发功能来实现将远程服务器上的端口映射到本地的端口。你可以通过以下命令来实现:

1
ssh -L 43242:localhost:42561 用户名@远程主机地址 -N -i 你的key文件

在这个命令中:

-L 43242:localhost:42561 指定了将本地的 43242 端口映射到远程主机的 42561 端口。
用户名@远程主机地址 是你在远程主机上的用户名和主机地址。
-N 参数表示不执行任何远程命令,这是因为你只是希望进行端口转发,而不需要在远程主机上执行任何命令。
运行这个命令后,你会被要求输入远程主机的密码或者使用 SSH 密钥登录。成功登录后,端口转发就会建立起来,将远程服务器上的 42561 端口映射到本地的 43242 端口。

现在你可以在本地访问 127.0.0.1:43242 来访问远程服务器上的 42561 端口。
/var/log/journal/ 目录通常是由 systemd-journald 服务用来存储日志文件。如果该目录下的文件占用了过多的空间,可以采取以下几种方法进行处理:

1. 配置日志保留策略

可以通过修改 journald 配置文件来限制日志的大小和保留时间。

  1. 打开 journald 配置文件:

    1
    sudo nano /etc/systemd/journald.conf
  2. 配置以下参数:

    • SystemMaxUse=:设置日志占用的最大空间。
    • SystemKeepFree=:设置保留的最小空闲空间。
    • SystemMaxFileSize=:设置单个日志文件的最大大小。
    • MaxRetentionSec=:设置日志的最大保留时间。

    例如:

    1
    2
    3
    4
    5
    [Journal]
    SystemMaxUse=500M
    SystemKeepFree=100M
    SystemMaxFileSize=50M
    MaxRetentionSec=1month
  3. 保存并退出编辑器。

  4. 重启 journald 服务:

    1
    sudo systemctl restart systemd-journald

2. 手动清理旧日志

可以使用 journalctl 命令来手动清理旧日志。

  1. 删除特定时间前的日志:

    1
    sudo journalctl --vacuum-time=2weeks

    上述命令将删除两周前的日志。

  2. 删除特定大小以上的日志:

    1
    sudo journalctl --vacuum-size=500M

    上述命令将把日志总大小限制在 500MB。

3. 完全清理所有日志

如果希望彻底清除所有日志,可以使用以下命令:

1
2
sudo rm -rf /var/log/journal/*
sudo systemctl restart systemd-journald

注意:这个操作会删除所有已保存的日志,请确保这些日志已经不再需要。

以上方法可以帮助你控制和管理 /var/log/journal/ 目录下日志文件的大小。如果有任何其他问题或需要进一步的帮助,请随时告诉我。

sudo lsof -i -n -P 是一个强大的命令,用于显示打开的网络文件(包括网络连接)。每个字段的意义如下:

1
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

以下是对这些字段的详细解释:

  1. COMMAND:

    • 表示打开文件的进程名称。
  2. PID:

    • 表示进程的进程ID。
  3. USER:

    • 表示打开文件的进程的用户ID。
  4. FD (File Descriptor):

    • 表示文件描述符,具体含义取决于文件类型。
    • 常见值包括:
      • cwd:当前工作目录。
      • txt:程序的文本代码。
      • mem:内存映射文件。
      • 012:标准输入、标准输出、标准错误。
      • x:内执行文件。
  5. TYPE:

    • 表示文件类型。
    • 常见值包括:
      • IPv4:IPv4网络连接。
      • IPv6:IPv6网络连接。
  6. DEVICE:

    • 表示设备号,格式为主设备号,次设备号。对于网络文件,这个字段通常是-
  7. SIZE/OFF:

    • 对于常规文件,表示文件的大小或文件的偏移量。
    • 对于网络文件,这个字段通常是-
  8. NODE:

    • 表示文件节点号(在文件系统中的索引节点号)。对于网络文件,这个字段通常是-
  9. NAME:

    • 表示打开的文件名或网络连接的详细信息。
    • 对于网络文件,这个字段包含网络连接的详细信息,如协议:端口IP地址等。

以下是一个示例输出:

1
2
3
4
COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd 1201 root 3u IPv4 34321 0t0 TCP *:22 (LISTEN)
sshd 1201 root 4u IPv6 34322 0t0 TCP *:22 (LISTEN)
chrome 1356 user 120u IPv4 35568 0t0 TCP 192.168.1.100:45321->93.184.216.34:443 (ESTABLISHED)

在这个示例中:

  • COMMAND:
    • sshd:表示SSH守护进程。
    • chrome:表示Google Chrome浏览器进程。
  • PID:
    • 1201:表示sshd进程的进程ID。
    • 1356:表示chrome进程的进程ID。
  • USER:
    • root:表示sshd进程的用户ID。
    • user:表示chrome进程的用户ID。
  • FD:
    • 3u4u:表示sshd进程的文件描述符。
    • 120u:表示chrome进程的文件描述符。
  • TYPE:
    • IPv4IPv6:表示网络连接类型。
  • DEVICE:
    • 3432134322:表示设备号。
    • 35568:表示设备号。
  • SIZE/OFF:
    • 0t0:表示文件大小或偏移量为零。
  • NODE:
    • -:表示没有节点号。
  • NAME:
    • TCP *:22 (LISTEN):表示sshd进程在所有IPv4地址上监听端口22。
    • TCP *:22 (LISTEN):表示sshd进程在所有IPv6地址上监听端口22。
    • TCP 192.168.1.100:45321->93.184.216.34:443 (ESTABLISHED):表示chrome进程在IP地址192.168.1.100的本地端口45321与IP地址93.184.216.34的远程端口443之间有一个已建立的TCP连接。

通过理解这些字段的含义,你可以更好地分析网络连接和打开的文件情况。

1
2
3
4
5
6
7
$ nslookup example.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: example.com
Address: 93.184.216.34

工程实践

2024-07-29 测试一个服务器程序,使用 golang 编写,使用了http的client请求方式。其中每秒钟3次post请求,都是相同的。最终发现只要带宽给够了,http1.1版本,能跑满 72M 带宽。而且底层的tcp连接只有一个就够了。

解压缩tgz

1
tar -xvzf filename.tgz
  1. 内存不足 (OOM - Out of Memory)

当系统内存不足时,Linux 内核的 OOM Killer(内存不足杀手)会终止占用大量内存的进程,以防止系统崩溃。Java 程序往往占用较多内存,因此可能成为被终止的目标。

检查方法:

•    查看系统日志文件 /var/log/syslog 或 /var/log/messages 中是否有 OOM Killer 的记录。可以使用以下命令查看日志:
1
dmesg | grep -i 'killed process'

或者

1
grep -i 'oom' /var/log/syslog

Aug 26 20:32:45 tron-node1 kernel: [1768037.780490] Out of memory: Killed process 1128462 (java) total-vm:25460616kB, anon-rss:15410248kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:37748kB oom_score_adj:0
Aug 26 20:32:45 tron-node1 systemd[1]: session-625.scope: A process of this unit has been killed by the OOM killer.
Aug 28 01:26:44 tron-node1 kernel: [1872074.946657] Gang worker#0 ( invoked oom-killer: gfp_mask=0x1100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Aug 28 01:26:44 tron-node1 kernel: [1872074.946687] oom_kill_process.cold+0xb/0x10
Aug 28 01:26:44 tron-node1 kernel: [1872074.946842] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
Aug 28 01:26:44 tron-node1 kernel: [1872074.946931] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-0.slice/session-493.scope,task=java,pid=1200809,uid=0
Aug 28 01:26:44 tron-node1 kernel: [1872074.947210] Out of memory: Killed process 1200809 (java) total-vm:24947732kB, anon-rss:15404948kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:37172kB oom_score_adj:0
Aug 28 01:26:45 tron-node1 systemd[1]: session-493.scope: A process of this unit has been killed by the OOM killer.

root@tron-node1:/data/superNode# dmesg | grep -i ‘killed process’
[1693233.563672] Out of memory: Killed process 1085342 (java) total-vm:25351704kB, anon-rss:15406196kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:36788kB oom_score_adj:0
[1768037.780490] Out of memory: Killed process 1128462 (java) total-vm:25460616kB, anon-rss:15410248kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:37748kB oom_score_adj:0
[1872074.947210] Out of memory: Killed process 1200809 (java) total-vm:24947732kB, anon-rss:15404948kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:37172kB oom_score_adj:0
你当前的 Java 应用在运行时遭遇了 “Out of Memory” 错误,系统的 OOM Killer 终止了该进程。你的 JVM 参数配置占用了大量的内存(9GB 堆内存、额外的元空间、代码缓存和直接内存),这可能导致了系统内存不足。

调整建议:

1. 降低堆内存大小 (-Xms-Xmx)

如果物理内存不足以支持当前配置,建议降低堆内存的初始和最大值。例如,尝试将 -Xms-Xmx 设置为 6GB 或 7GB:

1
-Xms7G -Xmx7G

2. 调整其他内存相关参数

  • -XX:MaxDirectMemorySize=1G: 直接内存大小设置为 1GB,这对于某些应用可能是过高的。如果你的应用对直接内存的需求不大,可以尝试减少这个值:

    1
    -XX:MaxDirectMemorySize=512m
  • -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m: 元空间的初始大小和最大值。根据应用的需求,这两个参数一般是合理的,但在极端情况下,也可以尝试减小最大元空间大小。

3. 监控系统资源

使用 htoptop 工具实时监控系统内存的使用情况,检查是否有其他进程占用了大量内存,可能需要优化或关闭其他不必要的进程。

4. 添加交换空间

如果物理内存仍然不足,可以考虑添加或增大交换空间(swap)。例如:

1
2
3
4
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

然后将其永久添加到 /etc/fstab 中。

5. 检查和优化 GC 策略

你当前使用的是 Concurrent Mark-Sweep (CMS) 垃圾回收器。虽然 CMS 适用于低延迟应用,但它也可能在内存紧张时增加内存消耗。可以考虑:

  • G1 GC: G1 GC 是 Java 8 之后的推荐垃圾回收器,适用于大部分场景,并且在内存管理上更有效。
    1
    -XX:+UseG1GC

6. 日志和诊断

检查 gc.logstart.log 日志,看看是否有指示性的信息,例如垃圾回收频率、长时间的 GC 暂停等,这些可能会帮助你进一步优化 JVM 参数。

通过以上调整,可以减少内存消耗,避免被 OOM Killer 终止进程。

mac services

由于使用了本地的 gitee 版本的 brew services 造成了各种问题。将其切换成github里面的版本,就好很多了。

引用