Linux环境下的开发优化

@wintry大约 5 分钟

文件内容乱码怎么办?

由于windows上文件的结束符和linux上的不同,那么在windows上编写的文件在Linux上就会报错: /bin/sh ^M: bad interpreter: No such file or directory

解决办法:

find / -name "*.sh" | xargs dos2unix

文件名乱码怎么解决?

在windows上使用ftp上传文件到Linux上,中文名称在Linux系统中显示为乱码。

原因在于,Windows 的文件名中文编码默认为GBK,压缩或者上传后,文件名还会是GBK编码,而Linux中默认文件名编码为UTF8。由于编码不一致所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码:

yum install convmv
convmv -f gbk -t utf-8 -r --notest /home/wwwroot

因MongoDB日志过大导致存储空间不足

自己签发TLS证书

openssl genrsa -des3 -out ssl.key 2048 
openssl rsa -in ssl.key -out ssl.key
openssl req -new -key ssl.key -out ssl.csr 
openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.pem

无网络安装依赖

Yum包

#1、用可联网的机器下载软件和依赖包 
yumdownloader --resolve yum-utils gcc make redis

#2、把下载好的包放在未联网机器上 
rpm -iv redis

pip包

#1、下载指定包到文件夹 
pip download -d install/pip_packages/ -r requirements.txt

#2、安装指定的离线包 
pip install --no-index --find-links="install/pip_packages/" -r requirements.txt

Linux同时打开文件数

Golang开发的端口扫描器,在Windows上运行正常可以扫描到20个开放端口,但是在Linux上只能扫描到2个开放端口,而且非偶发现象,且代码一致。

分析原因发现是net.DialTimeout这个函数最终其实就是调用linux socket,而linux中任何东西都是文件,同时linux默认允许同时打开的文件数是1024。

可以用如下命令查看:

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) 7823
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024        #默认允许打开的最大文件数
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) 7823
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以看到open files那一行,默认是1024,所以当启动远远大于1024个协程时(如代码中设置的2000),就有可能同时打开超过1024个文件,导致socket链接建立失败。

如何解决这个问题?
echo "* soft nofile 65533" >> /etc/security/limits.conf
echo "* hard nofile 65533" >> /etc/security/limits.conf
echo session required /lib/security/pam_limits.so >> /etc/pam.d/login
#重启系统

告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。

Linux网络内核优化

内核参数/etc/sysctl.conf是用来控制linux网络的配置文件,对于依赖网络的程序非常重要

直接使用的优化配置
cat > /etc/sysctl.conf <<EOF
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_default = 2097152
net.core.rmem_max = 5242880
net.core.wmem_default = 2097152
net.core.wmem_max = 5242880
net.ipv4.tcp_mem = 280521 374030 561042
net.ipv4.tcp_rmem = 1048576 2097152 5242880
net.ipv4.tcp_wmem = 1048576 2097152 5242880
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
fs.file-max = 10240000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 0
net.core.netdev_max_backlog = 30000
net.core.somaxconn = 32768
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_max_syn_backlog = 8912
EOF
sysctl -p

网络缓存大小

#本地端口使用范围
net.ipv4.ip_local_port_range = 1024 65535

#内核网络接收缓存大小
net.core.rmem_default = 2097152
net.core.rmem_max = 5242880

#内核网络发送缓存大小
net.core.wmem_default = 2097152
net.core.wmem_max = 5242880

#TCP缓存,最小值,默认值,最大值
net.ipv4.tcp_mem = 280521 374030 561042
#TCP接收缓存,最小值,默认值,最大值
net.ipv4.tcp_rmem = 1048576 2097152 5242880
#TCP发送缓存,最小值,默认值,最大值
net.ipv4.tcp_wmem = 1048576 2097152 5242880

TIME_WAIT问题优化

启用快速回收和连接复用

net.ipv4.tcp_tw_recycle = 1		#启用连接回收
net.ipv4.tcp_tw_reuse = 1		#复用已经分配的连接资源
net.ipv4.tcp_timestamps = 1		#记录标记时间戳,上边两个配置需要此配置的支持

net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度;缺省是2小时,改为20分钟

net.ipv4.tcp_fin_timeout = 30
#对于本端断开的socket连接,TCP保持在FINWAIT状态的时间(秒)系統默认的TIMEOUT 时间

net.ipv4.tcp_syncookies = 1
#当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭

net.ipv4.tcp_max_tw_buckets = 50000
#time Wait最多数量,默认为180000

TCP连接优化

#SYN/ACK重试次数默认为5,调低可以加快回收半连接,减少资源消耗,但是网络不好时会无法连接
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1

#增大服务器文件描述符数量
fs.file-max = 10240000

#重复发包,TCP重连机制
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 0

#在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 30000

#定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
net.core.somaxconn = 32768
net.ipv4.tcp_max_orphans = 32768

net.ipv4.tcp_max_syn_backlog = 8912
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。