简介
记录一下Linux运维相关的学习资料;
Centos
安装完,可以直接将/etc/sysconfig/network-scripts/ifcfg-xxx
此选项打开ONBOOT=yes
。这样一般都能上网了。
Powerlevel10k
https://github.com/romkatv/powerlevel10k
安装字体
1 | git clone https://github.com/ryanoasis/nerd-fonts.git --depth 1 |
使用这个主题,速度会非常快;
EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.如果不安装这个库,将会少了很多的软件包。yum -y install epel-release
可以安装一下zsh
,autojump
,autojump-zsh
,oh-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文件里面添加这些内容。
1 | # bindkey '\e[1~' beginning-of-line |
参考文档home-end-keys-in-zsh-dont-work-with-putty
有时候会升级失败,这个还是由于git访问不流畅造成。
- 先将本地的oh my zsh目录找到,通过git pull直接拉取最新的版本;
- 执行这个指令 upgrade_oh_my_zsh 就能将版本升级好了。
常用的软件:
1 | yum install -y wget git screen libtool automake |
man帮助文件的章节意义
1 | The section numbers of the manual pages are as follows: |
centos 7防火墙
检查防火墙状态
1 | firewall-cmd --list-all |
禁用随系统启动防火墙
1 | systemctl disable firewalld |
启用随系统启动防火墙
1 | systemctl enable firewalld |
关闭防火墙
1 | systemctl stop firewalld |
当前防火墙服务状态
1 | systemctl status firewalld |
永久开放防火墙端口
1 | firewall-cmd --permanent --zone=public --add-port=52310-52320/tcp |
重新加载防火墙规则
1 | sudo firewall-cmd --reload |
netcat 尝试端口连接
使用tcp4方式连接一个ip地址的端口
1 | nc -4 ip_address port |
在帮助文件里面可以获取更多的信息。
1 | Connect to example.org on TCP port 8080. |
检查端口情况
1 | netstat -tnlp |
检查当前
LNMP
在centos中一般直接使用套件来安装。
Linux系统设置
批量设置环境变量
https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs
.env
1 | AA=xxx |
env $(cat .env | xargs) rails
修改时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
locale设置
1 | [root@vm10-0-2-2 raw_database]# locale |
如果发现有问题,可以通过在/etc/profile文件中添加
1 | export LANG="en_US.UTF-8" |
检查coredump的配置
1 | # 查看coredump信息 |
一般我们将coredump文件生成目录重定向到一个固定的地方:
1 | mkdir -p /data/cores/ |
设置ulimit
1 | ulimit -n 65535 |
centos yum proxy
1 | /etc/yum.conf |
centos安装python3.6
1 | # 1. Install a package with repository for your system: |
遇到过的报错
1 | Error: ENOSPC:System limit for number of file watchers reached |
这个错误的意思时系统对文件监控的数量已经到达限制数量了!!
造成的结果: 执行的命令失败!或抛出警告(比如执行 react-native start 或者打开 vsocde)
解决方法:
修改系统监控文件数量
Ubuntu
1 | sudo vim /etc/sysctl.conf |
ubuntu
1 | sudo apt-get update && apt-get upgrade |
apt 相关知识
1 | apt-cache show libjemalloc-dev |
man 帮助文件安装
1 | sudo apt-get install linux-doc |
安装g++-11
1 | sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test |
mysql
权限相关
安装完成之后,需要做一些简单的处理,防止安全问题。mysql最后限制访问的ip地址,给指定的ip地址开放访问的独立的密码。
1 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'ip_address' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION; |
使用这个命令将处理掉mysql的一些安全问题。
1 | mysql_secure_installation |
mysql 8.0 版本 root 密码修改
需要执行
1 | flush privileges; |
然后再执行
1 | ALTER user 'root'@'localhost' IDENTIFIED BY 'root';--修改密码为root |
备份数据库
将某个数据库导出,不需要导出数据
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 | # WSL-Ubuntu18.04 LTS 重启方法 |
1 | Linux找出全部可执行文件,并且删除掉。 |
1 | We need to generate a lot of random bytes |
查看进程启动时间运行时间
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 | ps -eo pid,lstart,etime,cmd | grep java |
手动清理内存
1 | # 在crontab里面每隔5分钟清理一次 |
htop减少重复的进程
1 | 按F2 |
文件监视限制上限
1 | # Error: ENOSPC: System limit for number of file watchers reached |
wsl
导入之后默认账号需要切换成自己想要的:
1 | Method 1 - /etc/wsl.conf |
记录两款远程桌面工具
1 | sudo apt-get purge openssh-server # wsl2 自带的好像 sshd 不完整,先删除掉 |
frp
推荐使用这个透传;
将本地服务器gogs的3000转发出去:
1 | # 服务器配置 |
zeronet n2n
去中心化通讯。
neovim
ubuntu安装 g++ 11
1 | sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test |
htop
btop
btop更加多的信息可以查看;
通过指令看apt安装到什么目录了
1 | dpkg-query -L libssl-dev | grep -E 'openssl\/.+\.h$' |
iperf
可以通过这个工具来测试网路情况。
1 | 参数说明 |
内存清理
1 | echo 3 > /proc/sys/vm/drop_caches |
bash工具
科学上网
对比工具-替换掉之前的-beyond-compare
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 | # 查看是否已经分配了 |
aws扩容
1 | lsblk -f |
阿里云格式化硬盘添加硬盘
1 | fdisk -l --bytes |
1 | sudo mkdir /bsc |
使用权限
需要将key文件设置成 600,之前是0644权限;
1 | Permissions 0644 for '/Users/xxx/.ssh/xxxx.pem' are too open. |
ai语言
1 | Microsoft Azure XiaochenNeural |
export 的时候发现了报错
1 | export: not valid in this context |
netstat
1 | netstat Recv-Q |
统计日志里面重复选项
1 | awk '{print $6}' ./logs/log.log | sort | uniq -c | sort -k1n |
mac
Mac快捷键
1 | # 切换相同应用下的程序 |
android投放文件给mac
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 | ssh-keygen -t dsa -b 2048 -C "这里可以取名字" |
在生成密钥对时,请注意以下几点:
- 不要使用弱密码来保护私钥。
- 不要将私钥泄露给其他人。
- 不要在不必要的情况下将密钥对导出到文件中。
- 定期更新私钥以防止被盗。
可以使用 -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 | $ tree -L 3 ./ |
如何区分 ubuntu|centos
1 | # ubuntu |
Linux 如何创建 service
在Linux中,可以使用systemd工具来创建和管理服务(service)。以下是创建服务的的基本步骤:
- 创建服务单元文件:在/etc/systemd/system目录下创建一个服务单元文件,例如myservice.service。
- 编辑服务单元文件:使用文本编辑器打开服务单元文件,并按照以下格式编辑:
1 | [Unit] |
其中,Description字段是服务的描述信息;After字段指定服务启动的依赖项;Service字段指定服务的相关配置,如启动类型、命令路径、环境变量等;Install字段指定服务如何安装和启动。
- 重新加载systemd:执行systemctl daemon-reload命令,使systemd重新加载配置文件。
- 启动服务:执行systemctl start myservice命令,启动服务。
- 检查服务状态:执行systemctl status myservice命令,检查服务的状态。
- 添加服务到启动项:执行systemctl enable myservice命令,将服务添加到系统启动项中。
完成以上步骤后,您的服务就会在系统启动时自动启动,并且可以在需要时手动启动和停止。
常用命令
1 | systemctl [status|start|stop|enable] myservice |
编译的时候发现问题
1 | https://github.com/pingcap/tidb/issues/8955 |
出问题还是来自于我设置了这个环境变量。这样造成了问题,如果一个库编译的时候,需要使用到某个特定的库,应该是在本工程里面设置就好了。不要在.zshrc文件里面设置,否则会出现一些问题。
LDFLAGS
如何获取当前机器的internet出口
1 | curl ifconfig.me |
安装roguelike游戏
sudo apt-get install bsdgames-nonfree
用户管理
1 | useradd -s /bin/bash -m <用户名称> |
aria2
下载工具;
1 | yum install epel-release -y |
tar.zst 文件
1 | yum install zstd |
检查网络
1 | traceroute www.baidu.com |
如何查看
引用
如何使用 strace
strace -c -p PID -tt
等监控一段时间之后,ctrl+c取消掉,就能看到报告。
vscode 链接之后报错
1 | __vsc_prompt_cmd_original: command not found |
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 | # 在这个里面能找到全部服务器里面的这些服务 |
asdf 工具
1 | asdf plugin add elixir |
测试硬盘的读写速度
1 | root@ip-10-58-194-127:/data# dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync |
ncdu 工具
ncdu
是一个用于在终端中以交互方式浏览磁盘使用情况的命令行工具。ncdu 的全称是 “NCurses Disk Usage”,它使用 ncurses 库提供了一个基于文本的图形用户界面,让你可以直观地查看和管理文件系统上的磁盘空间。
1 | sudo apt-get install ncdu # For Debian/Ubuntu |
使用 watch 命令行监视 程序是否还在跑
在Linux中,如果你想要每隔固定时间(比如3秒)执行某个指令,并且将结果实时显示在控制台上,而不使用crontab,你可以使用watch命令。watch命令可以让你周期性地执行一个程序,并全屏显示执行结果。这非常适用于周期性地查看命令输出的场景。
1 | watch -n 秒数 要执行的指令 |
普通用户授权了 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 | socat TCP-LISTEN:42561,fork TCP:xxx.xxx.xxx.xxx:3362 |
可以直接使用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
配置文件来限制日志的大小和保留时间。
打开
journald
配置文件:1
sudo nano /etc/systemd/journald.conf
配置以下参数:
SystemMaxUse=
:设置日志占用的最大空间。SystemKeepFree=
:设置保留的最小空闲空间。SystemMaxFileSize=
:设置单个日志文件的最大大小。MaxRetentionSec=
:设置日志的最大保留时间。
例如:
1
2
3
4
5[Journal]
SystemMaxUse=500M
SystemKeepFree=100M
SystemMaxFileSize=50M
MaxRetentionSec=1month保存并退出编辑器。
重启
journald
服务:1
sudo systemctl restart systemd-journald
2. 手动清理旧日志
可以使用 journalctl
命令来手动清理旧日志。
删除特定时间前的日志:
1
sudo journalctl --vacuum-time=2weeks
上述命令将删除两周前的日志。
删除特定大小以上的日志:
1
sudo journalctl --vacuum-size=500M
上述命令将把日志总大小限制在 500MB。
3. 完全清理所有日志
如果希望彻底清除所有日志,可以使用以下命令:1
2sudo 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 |
以下是对这些字段的详细解释:
COMMAND:
- 表示打开文件的进程名称。
PID:
- 表示进程的进程ID。
USER:
- 表示打开文件的进程的用户ID。
FD (File Descriptor):
- 表示文件描述符,具体含义取决于文件类型。
- 常见值包括:
cwd
:当前工作目录。txt
:程序的文本代码。mem
:内存映射文件。0
、1
、2
:标准输入、标准输出、标准错误。x
:内执行文件。
TYPE:
- 表示文件类型。
- 常见值包括:
IPv4
:IPv4网络连接。IPv6
:IPv6网络连接。
DEVICE:
- 表示设备号,格式为
主设备号,次设备号
。对于网络文件,这个字段通常是-
。
- 表示设备号,格式为
SIZE/OFF:
- 对于常规文件,表示文件的大小或文件的偏移量。
- 对于网络文件,这个字段通常是
-
。
NODE:
- 表示文件节点号(在文件系统中的索引节点号)。对于网络文件,这个字段通常是
-
。
- 表示文件节点号(在文件系统中的索引节点号)。对于网络文件,这个字段通常是
NAME:
- 表示打开的文件名或网络连接的详细信息。
- 对于网络文件,这个字段包含网络连接的详细信息,如
协议:端口
、IP地址
等。
以下是一个示例输出:
1 | COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
在这个示例中:
- COMMAND:
sshd
:表示SSH守护进程。chrome
:表示Google Chrome浏览器进程。
- PID:
1201
:表示sshd
进程的进程ID。1356
:表示chrome
进程的进程ID。
- USER:
root
:表示sshd
进程的用户ID。user
:表示chrome
进程的用户ID。
- FD:
3u
和4u
:表示sshd
进程的文件描述符。120u
:表示chrome
进程的文件描述符。
- TYPE:
IPv4
和IPv6
:表示网络连接类型。
- DEVICE:
34321
和34322
:表示设备号。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 | $ nslookup example.com |
工程实践
2024-07-29 测试一个服务器程序,使用 golang 编写,使用了http的client请求方式。其中每秒钟3次post请求,都是相同的。最终发现只要带宽给够了,http1.1版本,能跑满 72M 带宽。而且底层的tcp连接只有一个就够了。
解压缩tgz
1 | tar -xvzf filename.tgz |
- 内存不足 (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. 监控系统资源
使用 htop
或 top
工具实时监控系统内存的使用情况,检查是否有其他进程占用了大量内存,可能需要优化或关闭其他不必要的进程。
4. 添加交换空间
如果物理内存仍然不足,可以考虑添加或增大交换空间(swap)。例如:1
2
3
4sudo 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.log
和 start.log
日志,看看是否有指示性的信息,例如垃圾回收频率、长时间的 GC 暂停等,这些可能会帮助你进一步优化 JVM 参数。
通过以上调整,可以减少内存消耗,避免被 OOM Killer 终止进程。
mac services
由于使用了本地的 gitee 版本的 brew services 造成了各种问题。将其切换成github里面的版本,就好很多了。
如何直接查询 ipv4地址
1 | curl -4 ifconfig.co |
引用
- [1] CentOS7 如何升级Git
- [2] 多次grep没有输出
- [3] 配置bsc- static- nodes
- [4] 使用P10k-zsh