Linux内核TCP连接Keep-Alive timeout的配置

Custom Configuration of TCP Socket Keep-Alive Timeouts 这是个古老的话题,我们在机器的优化中,需要设置 TCP Socket 的 Timeout 参数 用来加快 TCP 关闭无用闲置连接的时间 Linux 内核中有三个缺省参数: tcp_keepalive_time 缺省是 7200 秒 tcp_keepalive_probes 缺省是 9 tcp_keepalive_intvl 缺省是 75 秒 处理流程如下: 一、客户端打开一个 TCP socket 连接,开始跟服务器通讯 二、如果这条 socket 连接空闲没有任何数据传输,静默了 tcp_keepalive_time 秒后,那么客户端会主动发送一个空的 ACK 包到服务器 三、那么,根据服务器是否回应了一个相应的 ACK 包来判断 ACK 未回应 等待 tcp_keepalive_intvl 秒,然后再发一个 ACK 包 重复以上等待并发送 ACK 包的过程,直到次数等于 tcp_keepalive_probes 如果第2步做完还收不到任何回应,发送一个 RST 包并关闭连接 回应了: 回到上述第二步 那么缺省情况下,7200+75×9,一个没有任何数据传输的 socket 才会被关闭,大概是2小时11分钟。 ...

2021年11月02日 · 1 分钟 · 79 字 · 八戒

shell以及find的多线程执行

这属于Shell的高级技巧了,我们可能需要在 bash 中并发 wget rsync 文件,下面就讨论一下这个问题。 首先从简单的单线程开始: $ for i in $(seq 1 2); do echo $i; done 1 2 可以看到是顺序执行的,下面变多线程: $ for i in $(seq 1 2); do echo $i & done [1] 245505 1 [2] 245506 2 [1] Done echo $i [2] Done echo $i 可以看到我们只把 ; 号改成了 & 号,程序就变成了多线程执行。 区别在于 ; 号会等待之前的命令执行完毕再执行下一条,而 & 不等待,直接继续执行下一条;相当于后台运行了前一条命令。 下面说说 find 的单线程和多线程: find 的 exec 用法 $ find /path [args] -exec [cmd] {} \; {} 占位符号,存放find找到的记录 ; 对于每一条找到的单独记录,执行的cmd是一条一条单独执行的 执行的顺序如下: cmd result1; cmd result2; …; cmd result N $ find /path [args] -exec [cmd] {} \+ {} 占位符号,存放find找到的记录 + 对于找到的所有记录,执行的cmd是合并了所有记录集执行的 执行顺序如下: cmd result1 result2 … result N 多个exec可以串起来: ...

2021年10月29日 · 2 分钟 · 297 字 · 八戒

Linux下的程序限速软件Trickle

之前讲过如何对 opnvpn 总体限速,这次来了一个更严格的程序限速需求: 场景如下: 两个机房间有一条专线 100M 两个机房间需要同步数据,同步需要限制到60M,给别的程序留出带宽空间 传输是多个文件,用 rsync 并发传送 分析了一下脚本的核心部分 find . -type f | grep $(date -d"-1 day" +'%Y%m%d') |xargs -I % -P 30 rsync -auvPR % 192.168.9.17::mysql 发现是利用 xargs 的并发,-P 30 最大并发30个,启动了 rsync 同步 rsync 没有限速,这就麻烦了。 一、单文件单独限速 首先是使用 rsync 的 –bwlimit=600 参数,把速度限制为 600KB/s ,600×8=4800,单进程基本是5M的速度,最多只能跑12个了,就会跑到60M。 这样也不太对,尤其是 rsync 并发进程逐渐减少,少于12个的时候,这样就出现跑不满60M的现象。 二、多文件整体限速 那么 rsync 支持多文件传输 ,使用如下格式整体限速 rsync --bwlimit=7200 -auvPR 文件1 文件2 文件3 192.168.9.17::mysql 问题又来了,文件1 文件2 文件3 的路径非常长,而文件个数不定,有撑爆命令行单行长度限制的可能,也不可行 三、tc 使用 tc 可以控制源ip或者目的ip的带宽,但是本机网卡是万兆光卡,生产环境,每时每刻都有数据读写。 一旦错了,就直接完蛋了。也不太可行 四、杀器trickle 寻找了半天,终于找到了个大杀器trickle,可以对程序单独限速,也可以对一堆程序整体限速 安装: ...

2021年10月28日 · 1 分钟 · 140 字 · 八戒

Dockerfile的编写与调试技巧

Dockerfile 是造出镜像的基础,是必须熟知并了解的知识: 一、编写Dockerfile 先给个例子,是 minio 代理访问阿里的 OSS FROM alpine:3.12 RUN apk add --update bash && rm -rf /var/cache/apk/* COPY minio.RELEASE.2020-04-15T19-42-18Z /data/minio.RELEASE.2020-04-15T19-42-18Z ENV MINIO_ACCESS_KEY=LTAI5tFFTbsxxxxxuLb ENV MINIO_SECRET_KEY=t78PyGnHZilxxxxxdxBCjvNgtVC5Y WORKDIR /data EXPOSE 9000 CMD ["/data/minio.RELEASE.2020-04-15T19-42-18Z","gateway","oss","http://oss-cn-shanghai-internal.aliyuncs.com"] # CMD /bin/sh -c "while true; do echo hi; sleep 10; done" 详细解释每一条语句: FROM 基板,alpine 3.12 是个比较微小的版本,注意它的毛病,/bin/sh其实是busybox,没有/bin/bash,某些bash的函数功能支持不全,比如for循环 RUN 在容器中运行命令,上例中我们添加了 bash ,并清理了缓存。命令间用 && 可以避免镜像过多分层。 RUN分两种模式shell和exec模式: 我们只用 exec 模式,因为在 image 里装入多个 shell,没什么意义。 COPY 和 ADD ...

2021年10月28日 · 2 分钟 · 235 字 · 八戒

PHP程序如何发送syslog到远程服务器

给同事做了个 PHP 接口,转发发送短信的请求,同时要把发送记录发送到远程的 cacti 的 syslog 去 很简单,但是也不简单 首先是 PHP 服务器,是最简化编译的,php -m 查了一下 php -m [PHP Modules] Core ctype curl date dom fileinfo filter gettext hash iconv json libxml openssl pcre PDO pdo_sqlite Phar posix Reflection session SimpleXML SPL sqlite3 standard tokenizer xml xmlreader xmlwriter [Zend Modules] 居然没有 socket 模块,没办法,找到源代码,编译一个安装,原有的 php 安装路径是 /export/servers/php $ tar zxvf php-7.4.0.tar.gz $ cd php-7.4.0/sockets $ /export/servers/php/bin/phpize $ ./configure --enable-sockets --with-php-config=/export/servers/php/bin/php-config $ make $ make install 又看了一眼,是 php-fpm,居然没有 php.ini ,得,再生成一个,放在 /export/servers/php/lib/php.ini ...

2021年10月28日 · 2 分钟 · 332 字 · 八戒

没有装Docker如何从镜像中释放出文件

用 kubernetes 越多,用 docker 越多,就愈发感觉到好处多多。 简简单单的一个可执行文件,用 docker 基板 alphine 封装,就可以运行起一个 pod ,然后指定 deployment、svc、ingress,就可以将服务暴露出去。 其实很多情况下单可执行文件 + systemd也是不错的选择。 这不就遇到个问题,ghostunnel 这个软件,github 只释放出了源代码以及 windows 、linux 和 mac 的三个可执行版本。 可我的执行环境是 nanopi ,是个 arm7 的架构,就无计可施了。 无奈下,在 nanopi 上装了 go ,编译了个 arm7 的出来。 但是遇到 vaultwanden ,rust 的,就没法弄了,vps 太弱,根本无法用 cargo 编译。 那怎么办呢?方法如下,不安装 Docker ,也可以把镜像中的文件抽取出来 $ mkdir vm $ wget https://raw.githubusercontent.com/jjlin/docker-image-extract/main/docker-image-extract $ chmod +x docker-image-extract $ ./docker-image-extract vaultwarden/server:alpine Getting API token... Getting image manifest for vaultwarden/server:alpine... Fetching and extracting layer a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e... Fetching and extracting layer 3a9a529931676767ec84d35ab19774b24bd94e20f6fff7e6bda57ef5f2a66cfc... Fetching and extracting layer f9dcfa9aefe67ce52ab2a73e515ea715d242348b8fc338dbe4ca72a853ea0318... Fetching and extracting layer 4249d8cece35148b5faca2c6a98d566a271a1996b127b14480793ee8825e43c0... Fetching and extracting layer 72f4873a62cc82eaf28905077df3791e3b235bf5d17670e7aff6d5fb5e280739... Fetching and extracting layer 8eb772c524f9d998c8c7c92acc5ba96e3e9ebfb175dbb2441fe6e7b7598874f5... Fetching and extracting layer 663794f103b44abb8a90e1376dce14735905e2f938b4ca7e0ff379b09cbf6148... Image contents extracted into ./output. 这样我们就可以在 output 目录下得到 vaultwarden 和 web-vault ...

2021年10月27日 · 1 分钟 · 134 字 · 八戒

Bitwarden(vaultwarden)如何在非Docker环境下安装使用

为什么会有非 Docker 环境这个怪字眼呢? 无他,因为满网搜索到的教程都是在 Docker 环境下安装使用。 但是穷啊,八戒的 vps 是个单核 500m 的 justhost 机器,便宜的很,这种廉价机器来跑 Docker,基本要占100M,跑不太动。 这种一穷二白的环境,就只能把 Bitwarden 从容器里拆出来用。 好在 Bitwarden_rs 是一个 rust 程序,占内存(16M左右)和cpu极少,本身就适合在 systemd 环境下跑。 这里就利用 vaultwarden 和 traefik,在一台老破小服务器上运行。 系统环境是 CentOS 7.9 步骤如下: 一、下载bitwarden(vaultwarden) wget https://github.com/dani-garcia/vaultwarden/archive/refs/tags/1.23.0.tar.gz 二、安装cargo并编译(可选) yum install -y epel-release yum install -y openssl-devel cargo cd vaultwarden-1.23.0 cargo build --release --features sqlite 直接爆错啊,小小的 vps 连编译都过不去,编译进程都被 kill 掉了 三、下载vaultwarden主文件 编译不通,就只能想别的办法了。Faint 找一台有 docker 机器,从里面把文件都解析出来好了 docker pull vaultwarden/server:alpine docker create --name vw vaultwarden/server:alpine docker cp vw:/vaultwarden . docker cp vw:/web-vault . docker rm vw 这样会得到一个可执行文件 vaultwarden 和一个目录 web-vault ...

2021年10月27日 · 2 分钟 · 265 字 · 八戒

阿里云ACK完全生产环境规划和搭建

在生产环境来创建阿里ACK托管k8s集群的过程: 完全用于生产,不是搭建来做测试用的。 受公司委托,给的RAM用户,所以阿里云RAM第一次登录后,强制修改密码 然后授权资源管理, 正式开始建立过程 一、准备条件 两台及以上ecs服务器 阿里云账户余额100元以上(阿里云要求) 阿里云oss一个(oss和ecs在一个区域最好) 首先阿里云创建k8s集群要求至少有两台ecs服务器,可以创建集群的时候再购买,不要预先购买。 二、下面开始创建: 阿里云最左上角的菜单(新版本首页)->产品与服务->容器服务kubernetes版本 第一次创建会让开启ram授权,正常点击授权就可以 点击创建集群 点击后如下 各个选项的详细说明: 第一部分: 集群版本: 最上面可以选择ACK托管版,和其他4个版本,着重说一下专有版和托管版的区别 专有版本:master和worker都需要自己创建,如果需要高可用,那么master需要至少三个,也就是说,如果你不想把master和worker放在同一台服务器上,就要多使用三台服务器。 ACK托管版:master由阿里云给创建,自己只需要购买worker服务器。 集群名称: k8s-hbb 地域: 请选择自己ecs和rds等资源所在区域,这里是华东2(上海) Kubernetes版本:阿里云已经做好充分的测试了,所以选择默认的即可。这里是 1.18.8-aliyun.1 容器运行时: Docker 19.03.5 第二部分: 专有网络: 专有网络选择和ecs,rds同一个专有网络,这里是vpc-uf6pcr7nvp3dqmx86yyk0,网段是172.19.0.0/16 虚拟交换机: 同一个专有网络下面的交换机是可以互通的,这里新建一个虚拟交换机,网段是172.19.240.0/20 网络插件: 选Flannel,除去阿里云自己的区别描述,还有一点 如果使用flannel插件,则worker端对外,访问外网(比如短信接口等)使用的是worder所在ecs自己的eip或者如果使用的是snat模式,就是snat绑定的eip。如果使用的terway插件则走的就是snat的eip。注意,创建集群成功后,会为集群创建一个对外服务的ingress的slb,worker内部的容器直接对外访问,使用的不是这个slb的ip。slb只是进来的通道。 pod网络 CIDR:为统一起见,10.240.0.0/20 service CIDR:为统一起见,192.168.240.0/20 注意以上 建立好了三个网段,三个网段中均有240字段,便于记忆 ECS(2台):172.19.240.0/20 POD网段:10.240.0.0/20 Service网段:192.168.240.0/20 ​ 节点IP数量:256,指单个节点可运行 Pod 数量的上限。 一定要拉到最大量256 ,弄到16的话,一个节点本身要跑10多个system的pod,就无法跑应用pod了。 第三部分: 配置SNAT:必选配置SNAT,对外主动访问的时候IP需要一致。解释:如果ecs没有访问外网能力,则必须使用snat,snat就是把vpc绑定一个eip,然后给内部的ecs使用nat方式主动外出访问用的,比如主动反问第三方的接口等。如果ecs自己已经绑定了eip或者自带ip带宽,可以不选择。 APISERVER访问:必选公网EIP暴露,这个绑定以后ip不收费,可以使用流量包,管理master用的。如果要使用『云效』必选。 默认不选中使用EIP暴露API Server。 API Server提供了各类资源对象(Pod,Service等)的增删改查及watch等HTTP Rest接口。 - 如果选择开放,会创建一个EIP,并挂载到内网SLB上。此时,Master节点的6443端口(对应API Server)暴露出来,用户可以在外网通过kubeconfig连接并操作集群。 - 如果选择不开放,则不会创建EIP,您只能在VPC内部用kubeconfig连接并操作集群。 ...

2021年10月26日 · 1 分钟 · 119 字 · 八戒

Centos auto install cdrom自动安装cdrom的制作

之前介绍过如何制作一个 centos live cdrom 系统 那么,某些情况下我们可能无法弄一个 pxe 系统,而只能通过 idrac 挂载 iso 的方式安装系统 该如何去做呢? 步骤如下: 一、下载Centos的minimal安装光盘 wget http://mirrors.163.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso yum install -y mkisofs 二、准备kickstart安装文件 下载: centos7.ks text skipx install auth --useshadow --enablemd5 authconfig --enableshadow --passalgo=sha512 firstboot --disable keyboard us lang en_US.UTF-8 reboot cdrom firewall --disable selinux --disabled services --enabled="chronyd" logging level=info #ignoredisk --only-use=vda ignoredisk --only-use=sda #bootloader --location=mbr --append="net.ifnames=0 biosdevname=0 crashkernel=auto" bootloader --location=mbr --append="crashkernel=auto" rootpw --plaintext Renren2021! timezone Asia/Shanghai --isUtc network --device=lo --hostname=localhost.localdomain user --name=supdev --gid=511 --groups="supdev" --uid=511 --password="Renren2021!" zerombr clearpart --all --initlabel part biosboot --fstype=biosboot --size=1 part /boot --fstype ext4 --size=2048 part swap --asprimary --size=8192 part / --fstype ext4 --size=1 --grow #part biosboot --fstype=biosboot --size=1 #part /boot --fstype ext2 --size 250 #part pv.01 --size 1 --grow #volgroup vg pv.01 #logvol / --vgname=vg --size=1 --grow --fstype ext4 --fsoptions=discard,noatime --name=root #logvol /tmp --vgname=vg --size=1024 --fstype ext4 --fsoptions=discard,noatime --name=tmp #logvol swap --vgname=vg --recommended --name=swap #uefi #partition /boot/efi --asprimary --fstype=vfat --label EFI --size=200 #partition /boot --asprimary --fstype=ext4 --label BOOT --size=500 #partition / --asprimary --fstype=ext4 --label ROOT --size=4096 --grow services --enabled=network reboot %pre parted -s /dev/sda mklabel gpt %end %packages @core @system-admin-tools @additional-devel @virtualization-client @virtualization-platform @virtualization-tools libguestfs-tools-c perl-Sys-Virt qemu-guest-agent qemu-kvm-tools curl dstat expect openssl initscripts ipmitool lrzsz lsof mtools nc nmap perl perl-CPAN procps python screen sysstat systemtap systemtap-client systemtap-devel tcpdump telnet vim wget wsmancli zip chrony kexec-tools net-tools ntp ntpdate man acpid chrony telnet %end 三、准备生成iso的脚本 下载: makeiso.sh ...

2021年10月25日 · 2 分钟 · 352 字 · 八戒

vsftpd的日志设置

为了研发方便就给他们在内网开通了 vsftpd 的服务。 结果 java 直接有封好的 ftp library 可用,大家就直接用了。 导致任何单独的一个文件上传都会起一个 ftp 实例,没有复用 ftp 的 socket 链接 。系统挤压了大量的socket连接。 烦恼啊,出了事就麻烦。需要把日志都详细记下来 做法如下: vi /etc/vsftp/vsftpd.conf ...... dual_log_enable=YES log_ftp_protocol=YES xferlog_enable=YES xferlog_std_format=NO ...... 解释一下: dual_log_enable — 和 xferlog_enable 协同,会写两份日志,一份到/var/log/xferlog,一份到/var/log/vsftpd.log log_ftp_protocol — 和 xferlog_enable 协同,同时xferlog_std_format需要设置为NO,这样所有的 FTP 命令都会记录下来。 这样所有人的操作都会被记录下来,就后顾无忧了。

2021年10月25日 · 1 分钟 · 41 字 · 八戒