次元屋

技术 | 折腾 | 生活 | 日记


Explore Me
mhycy
次元屋
技术 | 折腾 | 生活 | 日记
10
9
9

[原题与讨论] 第 17 题:A、B 机器正常连接后,B 机器突然重启,问 A 此时处于 TCP 什么状态

问题定义

  • A -> B 发起TCP请求,A端为请求侧,B端为服务侧
  • TCP 三次握手已完成
  • TCP 三次握手后双方没有任何数据交互
  • B 在无预警情况下掉线(类似意外掉电重启状态)

问题答案

结论

A侧的TCP链路状态在未发送任何数据的情况下与等待的时间相关,如果在多个超时值范围以内那么状态为<established>;如果触发了某一个超时的情况那么视情况的不同会有不同的改变。

一般情况下不管是keepalive超时还是内核超时,只要出现超时,那么必然会抛出异常,只是这个异常截获的时机会因编码方式的差异而有所不同。(同步异步IO,以及有无使用select、poll、epoll等IO多路复用机制)

原因与相关细节

<大前提>

基于IP网络的无状态特征,A侧系统不会在无动作情况下收到任何通知获知到B侧掉线的情况(除非AB是直连状态,那么A可以获知到自己网卡掉线的异常)

在此大前提的基础上,会因为链路环境、SOCKET设定、以及内核相关配置的不同,A侧会在不同的时机获知到B侧无响应的结果,但总归是以异常的形式获得这个结果。

<关于内核对待无数据传递SOCKET的方式>

操作系统有一堆时间超级长的兜底用timeout参数,用于在不同的时候给TCP栈一个异常退出的机会,避免无效连接过多而耗尽系统资源

其中,<TCP KeepAive>特性能让应用层配置一个远小于内核timeout参数的值,用于在这一堆时间超长的兜底参数生效之前,判断链路是否为有效状态。

<关于超时的各个节点>

以下仅讨论三次握手成功之后的兜底情况

TCP链路在建立之后,内核会初始化一个由<nf_conntrack_tcp_timeout_established>参数控制的计时器(这个计时器在Ubuntu 18.04里面长达5天),以防止在未开启TCP keepalive的情况下连接因各种原因导致的长时间无动作而过度消耗系统资源,这个计时器会在每次TCP链路活动后重置

TCP正常传输过程中,每一次数据发送之后,必然伴随对端的ACK确认信息。如果对端因为各种原因失去反应(网络链路中断、意外掉电等)这个ACK将永远不会到来,内核在每次发送之后都会重置一个由<nf_conntrack_tcp_timeout_unacknowledged>参数控制的计时器,以防止对端以外断网导致的资源过度消耗。(这个计时器在Ubuntu 18.04里面是300秒/5分钟)

以上两个计时器作为keepalive参数未指定情况下的兜底参数,为内核自保特性,所以事件都很长,建议实际开发与运维中用更为合理的参数覆盖这些数值

<关于链路异常后发生的操作>

A侧在超时退出之后一般会发送一个RST包用于告知对端重置链路,并给应用层一个异常的状态信息,视乎同步IO与异步IO的差异,这个异常获知的时机会有所不同。

B侧重启之后,因为不存有之前A-B之间建立链路相关的信息,这时候收到任何A侧来的数据都会以RST作为响应,以告知A侧链路发生异常

RST的设计用意在于链路发生意料之外的故障时告知链路上的各方释放资源(一般指的是NAT网关与收发两端);FIN的设计是用于在链路正常情况下的正常单向终止与结束。二者不可混淆。

<关于阻塞>

应用层到底层网卡发送的过程中,数据包会经历多个缓冲区,也会经历一到多次的分片操作,阻塞这一结果的发生是具有从底向上传递的特性。

这一过程中有一个需要强调的关键点:socket.send这个操作只是把数据发送到了内核缓冲区,只要数据量不大那么这个调用必然是在拷贝完之后立即返回的。而数据量大的时候,必然会产生阻塞。

在TCP传输中,决定阻塞与否的最终节点,是TCP的可靠传输特性。此特性决定了必须要有ACK数据包回复响应正确接收的数据段范围,内核才会把对应的数据从TCP发送缓冲区中移除,腾出空间让新的数据可以写入进来。

这个过程意味着,只要应用层发送了大于内核缓冲区可容容纳的数据量,那么必然会在应用层出现阻塞,等待ACK的到来,然后把新数据压入缓冲队列,循环往复,直到数据发送完毕。

原贴发布于V2EX, 讨论热烈...
/t/477885

前言

源公告贴地址在此: 关于客户“前沿数控”数据完整性受损的技术复盘

昨日在 "腾讯云的事,是不是很多人以为三副本就是备份,不应该丢数据,很靠谱...." #28 帖子中做出了一些个人的推断

甚至有点怀疑是不是有人手动的“ rm -rf ”然后后续业务直接写花了集群

今天的这份公告的信息算是印证了部分的猜测

正文

公告中提到的部分细节因经验不足产生疑问,希望各位大佬可拍砖指教


疑问 1

在14:05时,运维人员从仓库Ⅰ选择了一批云盘搬迁至新仓库Ⅱ,为了加速搬迁,手动关闭了迁移过程中的数据校验;

一个按照高可用、高可靠、数据可信的原则构建的存储架构
显然读取过程中的块级校验是必不可少的,否则数据的可信性无从谈起
(因为根本不知道读取出来的数据是否为异常数据)

校验过程必然需要消耗一定的资源
类似于ZFS, 需要大量的CPU资源进行读取过程中的校验
所以一般的实现方案会把存储与计算分离开来, 降低互相之间的影响

在公告中提到的一点 "为了加速搬迁"
为了实现读取过程中的校验,必然需要消耗一定的资源
独立的存储平台,自然也需要为了这个消耗的资源配备足量的运算资源
读取校验理应默认开启, 且对性能影响近乎无感 (增加了运算延迟)
而在这个公告中提到的"为了加速搬迁"...
那么....

  • 什么情况下关闭校验可以加速搬迁?

疑问 2

在20:27 搬迁完成之后,运维人员将客户的云盘访问切至仓库Ⅱ,同时为了释放空间,对仓库Ⅰ中的源数据发起了回收操作;

  • 什么情况下才能让运维人员那么着急回收空间释放资源?

疑问 3

在20:27 搬迁完成之后,运维人员将客户的云盘访问切至仓库Ⅱ
到20:30 监控发现仓库Ⅱ部分云盘出现IO异常。

  • 在线迁移为什么14:05分开始的数据迁移要到20:30分才发现IO异常?

(不了解腾讯云底层的实现架构, 学艺不精没想通, 望各位大佬回帖指教)

原贴发布于V2EX, 详细讨论见以下两个地址:
/t/477408 #28
/t/477439

前言

这本是帖子「腾讯云的事,是不是很多人以为三副本就是备份,不应该丢数据,很靠谱....」的一个回复
回复发出后自我感觉良好,遂稍作优化作为个人看法独立发帖,望各位大佬拍砖指正

正文

个人看法高可用的存储底层节点架构应符合以下准则
1、应为非同批次、非同固件的等容量、等架构磁盘组建硬件 /软件 RAID
2、应配合巡检定期校验数据是否可用,并尽早踢出异常磁盘
3、存储节点自身应具有完善的警告预警机制
4、三备份的集群架构应是基于此磁盘架构的冗余备份架构,无论是实时互备还是定时冷备

一般云 VPS 服务的自动迁移依赖独立的磁盘柜与计算集群实现
那么在腾讯的这个案例上,可能存在三台阵列柜、一套磁盘阵列网关与若干计算节点组成的计算机群
丢失数据的范围为一个集群(假定整个集群都出现静默错误,且真的存在三备份架构)

那么问题来了
1、为什么现在只有一家公司发声?
2、如果真的是三备份架构,为什么会三套存储设备同时故障?
3、为何阵列损坏后没有任何警告、通知直接就是静默错误?

假设现在的信息都为真实信息,没有人为修饰掩盖
有以下推断:
1、不存在三套设备互备的磁盘架构
2、这个软件 BUG 不在硬盘而在软件分布式上面
3、假设 2 推断为假,软件 BUG 位于磁盘,则阵列架设没有严格遵守高可用原则进行设计
4、假设 2 推断为真,那么更有可能的情况是 BUG 位于阵列卡,数据位于单一母机,丢失范围为一台母机
5、假设 2 推断为真,数据存在集群上面,且 BUG 位于自研的分布式存储平台上,那么...不多说了

说实在,怎么想都想不出来为什么一个成熟的云平台能搞到数据全丢
单个磁盘的静默损坏对于磁盘阵列的构建是必然需要考虑的问题
ZFS 的设计就是为了抵御这类事情的发生
甚至有点怀疑是不是有人手动 /某个自动化 BUG 的 "rm -rf" 了特定的虚拟机磁盘文件然后后续业务直接写花了集群
这应该是可能性更高的情况

补充看法

也许很多人认为云服务就应该是绝对可靠,毕竟有许多业界大佬进行维护与开发。
这想法没错,但是考虑到可能存在的风险,以及云服务商并不会提供底层架构的具体细节
理应对云服务的安全性、可靠性有所保留,自行备份 /同步各项业务数据
这是对业务的负责,也是一个技术人员专业性的表现。

在现有的商用家用宽带环境下,在众多开源隧道方案的加持下(重点推荐 ZeroTier )
实时同步数据库数据到本地进行持续热备应不是难事(二进制日志远程写入)
而业务数据,定期同步到别的地方所需要的磁盘空间以及带宽消耗也是可以接受的
对公司的投入也仅仅是一个本地的磁盘柜以及相应的带宽投入而已。
而下行带宽,显然是相当的便宜

作为商业数据,数万元的本地硬件投入,采购二手平台甚至可以做到万元级投入
这应该是可以接受的吧?

前言

记录让 Win10 能好好使用而设置的安装后优化项目,不定期更新

安装过程中注意事项

  • 安装完毕后的用户密码留空,并通过计算机管理首先打开 Administrator 用户权限
  • 关闭 Cortana 的菜单栏图标,以及人脉图标
  • Cortana的搜索功能可通过 StartIsBac 找回

系统选项

  • 此电脑 -> 属性

    • 重配虚拟内存
    • 关闭系统保护
    • 开启远程桌面

控制面板

  • 关闭防火墙 控制面板\系统和安全\Windows Defender 防火墙\
  • 调整休眠选项 控制面板\系统和安全\电源选项
  • 调整网卡参数 控制面板\网络和 Internet\网络和共享中心
  • 调整安全维护通知信息 控制面板\系统和安全\安全和维护
  • 启用部分 Windows 功能 控制面板\程序

    • .Net Framework 3.5
    • SMB 1.0/CIFS 文件共享支持

设置

  • 系统

    • 通知和操作

      • 关闭 “获取来自应用和其他发送者的通知”
    • 多任务处理

      • 虚拟桌面按需调整
  • 设备

    • 蓝牙和其他设备

      • 通过按流量计费的连接下载
    • 自动播放

      • 在所有媒体设备上使用自动播放
  • 网络和Internet

    • “更改连接属性” 所有更新结束后改成付费模式
  • 个性化

    • 主题

      • 桌面图标设置” 添加桌面图标
    • 字体

      • 下载所有语言的字体
    • 任务栏

      • 使用小任务栏按钮
      • 通知区域

        • 打开或关闭系统图标
  • 应用和功能

    • 卸载无用软件
    • “管理可选功能” 添加部分必须软件包
    • “默认应用” 修改默认应用
  • 时间和语言

    • 区域和语言

      • 安装日语输入法后在此更新支持支持并重排输入法顺序
  • 更新和安全

    • 安装完毕后择期检查 Windows 更新,并安装,以更新驱动以及安全更新
    • 通过开发者选项安装开发者软件包

组策略

  • 计算机配置

    • 管理模板

      • Windows 组件

        • Windows Defender 防病毒程序

          • 关闭 Windows Defender 防病毒程序
        • Windows 更新

          • 不要在“关闭Windows”对话框显示“安装更新并关机”
          • 配置自动更新 (禁用)
        • 推送安装

          • 关闭推送安装服务
        • 应用程序兼容性

          • 关闭程序兼容性助理
        • 应用商店

          • 关闭 Win8 计算机上的自动下载更新
          • 关闭自动下载和安装更新
        • 云内容

          • 不显示 Windows 使用技巧
          • 关闭 Microsoft 用户体验
      • 网络

        • Lanman 工作站

          • 启用不安全的来宾登录
      • 系统

        • Device Guard

          • 打开基于虚拟化安全 (禁用)
        • 凭据分配

          • 加密 Oracle 修正 (已启用, 易受攻击)
  • 用户配置

    • 管理模板

      • Windows 组件

        • 应用程序兼容性

          • 关闭程序兼容性助理
      • 系统

        • Windows 自动更新 (禁用)

注册表

  • 修复传统图片浏览器文件关联
  • Windows Photo Viewer 支持查看设备直出的Raw文件, 需要 MicrosoftCameraCodecPack 支持, 并手动修复关联(大概)

    Windows Registry Editor Version 5.00
    [HKEY_CURRENT_USER\Software\Classes\.jpg]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.jpeg]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.gif]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.png]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.bmp]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.tiff]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.ico]
    @="PhotoViewer.FileAssoc.Tiff"
    [HKEY_CURRENT_USER\Software\Classes\.arw]
    @="PhotoViewer.FileAssoc.Tiff"
  • 优化系统选项

    Windows Registry Editor Version 5.00
    
    ; 关闭 Windows 应用推送
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CloudContent]
    "DisableWindowsConsumerFeatures"=dword:00000001
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager]
    "SilentInstalledAppsEnabled"=dword:00000000
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System]
    "EnableActivityFeed"=dword:00000000
    
    ; 修复共享文件夹来宾权限问题
    [HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
    "AllowInsecureGuestAuth"=dword:00000001

PowerShell

  • Win10垃圾应用批量卸载 (复制粘贴到 PowerShell 运行, 注意权限)

    Get-AppxPackage *OneNote* | Remove-AppxPackage
    Get-AppxPackage *camera* | Remove-AppxPackage
    Get-AppxPackage *communi* | Remove-AppxPackage
    Get-AppxPackage *bing* | Remove-AppxPackage
    Get-AppxPackage *zune* | Remove-AppxPackage
    Get-AppxPackage *people* | Remove-AppxPackage
    Get-AppxPackage *phone* | Remove-AppxPackage
    Get-AppxPackage *photo* | Remove-AppxPackage
    Get-AppxPackage *solit* | Remove-AppxPackage
    Get-AppxPackage *soundrec* | Remove-AppxPackage
    Get-AppxPackage *xbox* | Remove-AppxPackage
    Get-AppxPackage *sticky* | Remove-AppxPackage
    Get-AppxPackage *skype* | Remove-AppxPackage
    Get-AppxPackage *3DViewer* | Remove-AppxPackage
    Get-AppxPackage *Print3D* | Remove-AppxPackage
    
    Get-AppxPackage *PowerBIforWindows* | Remove-AppxPackage
    Get-AppxPackage *Actipro* | Remove-AppxPackage
    Get-AppxPackage *Eclipse* | Remove-AppxPackage
    Get-AppxPackage *Pandora* | Remove-AppxPackage
    Get-AppxPackage *AdobePhotoshop* | Remove-AppxPackage
    Get-AppxPackage *Duolingo* | Remove-AppxPackage
    Get-AppxPackage *NetworkSpeedTest* | Remove-AppxPackage
    
    Get-AppxPackage *3DBuilder* | Remove-AppxPackage
    Get-AppxPackage *WindowsAlarms* | Remove-AppxPackage
    Get-AppxPackage *DesktopAppInstaller* | Remove-AppxPackage
    Get-AppxPackage *WindowsCalculator* | Remove-AppxPackage
    Get-AppxPackage *WindowsCamera* | Remove-AppxPackage
    Get-AppxPackage *WindowsFeedbackHub* | Remove-AppxPackage
    Get-AppxPackage *GetHelp* | Remove-AppxPackage
    Get-AppxPackage *OfficeHub* | Remove-AppxPackage
    Get-AppxPackage *SkypeApp* | Remove-AppxPackage
    Get-AppxPackage *Getstarted* | Remove-AppxPackage
    Get-AppxPackage *ZuneMusic* | Remove-AppxPackage
    Get-AppxPackage *communicationsapps* | Remove-AppxPackage
    Get-AppxPackage *WindowsMaps* | Remove-AppxPackage
    Get-AppxPackage *Messaging* | Remove-AppxPackage
    Get-AppxPackage *Microsoft3DViewer* | Remove-AppxPackage
    Get-AppxPackage *ZuneVideo* | Remove-AppxPackage
    Get-AppxPackage *BingNews* | Remove-AppxPackage
    Get-AppxPackage *OneNote* | Remove-AppxPackage
    Get-AppxPackage *MSPaint* | Remove-AppxPackage
    Get-AppxPackage *People* | Remove-AppxPackage
    Get-AppxPackage *Photos* | Remove-AppxPackage
    Get-AppxPackage *Print3D* | Remove-AppxPackage
    Get-AppxPackage *SolitaireCollection* | Remove-AppxPackage
    Get-AppxPackage *MicrosoftStickyNotes* | Remove-AppxPackage
    Get-AppxPackage *WindowsStore* | Remove-AppxPackage
    Get-AppxPackage *Sway* | Remove-AppxPackage
    Get-AppxPackage *SoundRecorder* | Remove-AppxPackage
    Get-AppxPackage *Wallet* | Remove-AppxPackage
    Get-AppxPackage *BingWeather* | Remove-AppxPackage
    Get-AppxPackage *XboxApp* | Remove-AppxPackage
    Get-AppxPackage *OneConnect* | Remove-AppxPackage
    Get-AppxPackage *StorePurchaseApp* | Remove-AppxPackage

Github 地址: hardware-gen8-pwm-convert

前言

HP MicroServer Gen8 虽好, 但风扇略吵
网络上的各路大神给出了一堆方案, 有屏蔽上温控器的, 有加电阻的
还有看起来最靠谱的直接替换
就像这个贴 无需外部电路,将HP Gen8替换为普通PWM风扇,并保持自动调速

电源供电, PWM 引脚作为地线, 这样就能控制风扇转速了~
看起来很美好对吧?能把风扇控制在一个极低的转速, 但是...错了...

开始实验的时候就会发现, 这个接线方式会使得风扇维持在一个不可思议的低转速状态
风扇的实际转速和面板的转速百分比完全不在一个等级上面
同时测量电源对PWM信号引脚的等效电压会发现等效电压的增减与面板一致....

研究过相关文档以及详细的测量对比后会发现这其实是利用了GEN8特殊的PWM信号定义
以及其漏极开路输出的特性所达到的控制效果

把PWM信号当成地线使用, 随着PWM占空比增加, 等效电压降低, 风扇转速降低

为什么说这是 Gen8 特殊的PWM定义呢?
网络上找到的4-pin风扇PWM信号定义文档可以给出答案
(点击下载)源地址(4_wire_pwm_spec.pdf)
(点击下载)本站镜像(4_wire_pwm_spec.pdf)

按照标准的定义, CPU风扇的PWM信号理应随着PWM等效电压的增加而加速, 随着等效电压的降低而减速
Gen8 的PWM信号刚好相反而行, 随着等效电压的增加而减速, 显然是个反相定义的信号

这也是为什么论坛上没有直接替换案例的缘由
仅仅屏蔽RD引脚, 把风扇接入, 会发现开机过程中风扇会在不可思议的低速, 然后不断增加

那有没有完美的方案呢?
既可以使用系统的PWM信源, 又可以替换成自己的风扇, 还不需要改动 Gen8 的风扇接口 (Gen8的风扇端口非常特殊)

造个驱动板就好了~

这就是本文的来历

需求

  • 无损的引出 Gen8 的风扇端口不造成任何破坏
  • 把 Gen8 的 PWM 变成正常的信号, 且合规
  • 欺骗 RD(Rotation Detect) 引脚
  • 自带多电压输出[12V, 5V]以支持芯片组散热用的迷你风扇 (目标改成水冷风压不够被动散热的)

坑点与实现

  • 需要找到 Gen8 风扇所使用的插针标准, 最终找到这个: PHD2.0-2*3
  • 需要符合漏极开路输出的信号反相器, 寻找一个需要电平兼容以及漏极开路输出的与非门, 74系列走起~ CD74HCT03M
  • 多电压输出, 原本的输入是12V, 那么只需要实现 5V的输出即可...考虑到电流, DC-DC电路实现

原理图-电源
忘记从哪里抄回来的DC-DC电路, 是个很经典的设计
感谢 V2EX 大佬 @zhujinliang 提醒 源DC-DC设计是 kis3r33s
原理图-电源.png

原理图-逻辑与输出
原理图-逻辑与输出.png

PCB走线
圆润可靠的走线~
PCB走线.png

PCB渲染图
真的好看!!!
PCB渲染图.png

实际成品
这嘉立创又把字刷歪了!!!!还断线!!!!说好的数字化印刷呢?
成品图.JPG