#101 inode 使用率太高的问题

2023-04-03

Jenkins 发布失败,日志显示 scp No space left on device,也就是磁盘空间不足。

查看之后发现是磁盘占用其实不高,不过 inode 使用率满了(其实监控也在报),也就是说小文件太多了。

[staff001@192.168.64.234 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1              40G   29G  8.7G  77% /
tmpfs                 972M     0  972M   0% /dev/shm
/dev/vdb               99G   41G   54G  44% /data

[staff001@192.168.64.234 ~]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/vda1            2621440 2621440       0  100% /
tmpfs                 248685       1  248684    1% /dev/shm
/dev/vdb             6553600  467525 6086075    8% /data

通过经验和 find 命令找到文件太多的目录:

find /var -xdev -printf '%h\n'          | sort | uniq -c | sort -n | awk '{sum+=$1;print $0;}END{print "\nTotal: "sum}'

# 只看二级目录的数据
find /var -xdev -type f | cut -d / -f 3 | sort | uniq -c | sort -n | awk '{sum+=$1;print $0;}END{print "\nTotal: "sum}'

#100 Linux 网络:开放端口范围

2023-03-03

线上环境,有一个服务启动时,四个进程只成功了三个,检查发现端口被占用。
再一看,是被另外三个进程中的一个连接 MongoDB 占用了。

# 查看
cat /proc/sys/net/ipv4/ip_local_port_range
1024    65000

$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 1024     65000

PS:查了一下,个人机器(Ubuntu)上配置的是:32768 60999

把下限往上提到 20000,避开服务常用接口:

# 临时配置
echo "20000 65000" > /proc/sys/net/ipv4/ip_local_port_range
sysctl -w net.ipv4.ip_local_port_range="20000 65000"

# 持久配置
vim /etc/sysctl.conf

#98 bash 上下键搜索历史记录

2022-12-16

我一直用 zsh + omz,但是毕竟 bash 才是大多数情况下的默认 Shell。

zsh 和 bash 都是用上下键来搜索历史记录,但是不同的是,zsh 会利用已经输入部分做前缀匹配,而 bash 不会,只是简单的上一条、下一条。

今天学会一个方法(Bash history search, partial + up-arrow):

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

凑活凑活吧。

已经加到我个人的 bash 配置中。

#97 转载:Linux/UNIX 编程如何保证文件落盘

2022-11-10

我们编写程序 write 数据到文件中时,其实数据不会立马写入磁盘,而是会经过层层缓存。每层缓存都有自己的刷新时机,每层缓存都刷新后才会写入磁盘。这些缓存的存在是为了加速读写操作,因为如果每次读写都对应真实磁盘操作,那么读写的效率会大大降低。带来的坏处是如果期间发生掉电或者别的故障,还未写入磁盘的数据就丢失了。对于数据安全敏感的应用,比如数据库,比如交易程序,这是无法忍受的。所以操作系统提供了保证文件落盘的机制。我们来看下这些机制的原理和使用。

#93 HTTP 超时相关的疑问

2022-02-25

今天发现一个奇怪的现象,相同的代码在 CentOS 7 服务器上发起 HTTP 请求 3 秒之后超时,报 “TimeoutError: [Errno 110] Connection timed out”。
在我本地就按我们的定义的超时时间 5 秒超时,报 “tornado.simple_httpclient.HTTPTimeoutError: Timeout while connecting”。