菜菜博士

博士在网络的家

高并发服务器的静态内存分配策略

asio 的 async_accept 函数在高并发的时候,会发生遗漏 accept 的情况。根本原因在于,async_accept 回调的时候,已经 监听的socket已经没有执行 accept 操作了。 解决的办法就是投递多个 async_accept. asio 的 async_* 系列 函数通常只能投递一次,多次投递会发生未定义行为。async_accept 是为数不多的例外。 通...

挖矿与创新

所谓挖矿,就是寻找一个随机数,是的区块头部和随机数结合后的 sha256 数值小于一个特定的目标数字。 对于哪一个随机数能找到答案,没有人知道,也没有捷径,唯一的做法,就是一个一个的去试。 比特币诞生也有9年了,9 年来,不断的有人尝试寻找捷径,但最终都没有找到,只能依靠暴力穷举随机数。 只要尝试的次数足够多,参与尝试的矿工足够多,大约每十分钟总会有一个幸运儿找到这样的随机数。 当他找到...

换用wireguard

之前把家里网络 重新折腾 了一下, 用的是 走socks5 代理的 tcp 协议 openvpn. socks5 代理由 shadowsocks 提供. 不过, 最近偶然在 LWN 发现了 wireguard 这个新型 VPN, 于是盘算着用起来看看效果. 结果一不小心, 发现了vyatta-wireguard, 这个可以让我的路由器也能用 wireguard! 于是按照它的文档配置到了...

UPS和直流供电的思考

为了在网络断电后还能使用, 我曾经给路由器配置 12v 直流 UPS. 但是, 随着我的网络扩展, 出现了更多的设备, 而且这些设备不再是12v电压供电的了, 而是出现了 24v 和 54v 供电的设备. 同时, 12v 供电的设备也增加了, 原来的 UPS 容量就显得捉襟见肘了. 我继续要对 UPS 进行一次升级. 一劳永逸的解决方式, 其实是直接购买普通的 220v 逆变输出的 UPS...

网络重新配置

一直以来, 我用的都是基于 ss-redir 和 ipset + iptables 透明代理方式的科学上网. 但是 iptables 方式的上网, 其实还是不如 ChinaRoute 配合 VPN 来的爽. 因为只有 TCP 连接能被透明代理出去, UDP 和 ICMP 协议统统不能. 但是 openvpn 这种协议实在是太过招摇, 所以早就被方校长盯上了. 不可不可. 后来, 我想到了...

Immutable, RCU and Transnational Container

在编写并发程序的时候,经常要面对共享数据结构的保护问题。 虽然 C++ 提供的 RAII 实现的各种 guard lock 模式,早就让“忘记解锁” 导致的死锁成为历史。但是,锁带来的性能损耗依然是我们不得不面对的问题。 为了避免锁带来的开销,使用“无锁” 的数据结构似乎是个好主意。 然而事情的发展总是出乎所有人的意料。现代的多核CPU随着核数的越来越高,核与核之间的通信开销也变得越来越大...

C++ 是最好的编程语言

好的语言是怎么来的? 有人说, 是设计出来的, 有人说, 是抄出来的. newbie 说, 是实践来的. 什么是实践呢? 实践, 就是摸石头过河, 吸收合适的, 抛弃不合适的. 这不就是进化吗? 正如好的物种是进化来的一样, 好的语言也是进化来的. 物种的进化, 首先是要适应已有的环境, 然后才是展望未来, 设法适应未来的环境. 即使某些功能器官已经不再需要, 仍然保留着进化的痕迹. ...

不停机迁移

设计一套系统的时候, 最初的数据库结构总是不能适应未来业务的发展变化。经常需要调整数据库的表结构以适应新的业务需求或调整逻辑结构。 为此,需要让系统能支持不停机迁移。不停机迁移,用户0感知的,完成数据库升级。要做到这点,首先要做到程序本身的热更新。 如果是 php 之类的脚本语言编写的服务器端程序,热更新实现起来倒也轻松容易。但是既然是我这个c++佬出来写文章, 一定是关注的c++编写的...

使用异常实现cache

异常用来做错误处理的时候,程序到处都是 try cache ,代码十分的丑陋,我是不怎么喜欢的,我喜欢 asio 那种用 error_code 汇报错误 —— 不传 ec 的时候就抛异常,传就不抛,改为写入错误到 ec。 但是,异常用来做流程控制,又特别的好用。流程控制,无非顺序、选择、分支和循环。在 c++里,又比 C 多了一个异常。在嵌套很深的地方,跳出逻辑,除了异常,就没有其他更...

免费版的 PrimoCache

去年DIY一个 NAS. 其实就是台 MINI PC. 自带一个很小的 mSATA SSD 用来装系统, 然后外接了一个大 HDD 做存储. 问题在于, 这个 大 HDD 是渣机械, 一开迅雷, 硬盘就被 100% 占用! 然后导致整个 OS 响应迟缓. 然后因为 HDD 写入速度不足, 导致迅雷下载速度 0 . 磁盘疯狂写入. 后来下了一个 PrimoCache ( 以前叫 Fancy...

通知到轮询线程

在腐都工作也有大半个月了。工作过程中,遇到了一个轮询+通知的消息模式。所以要轮询,是因为通知是不可靠的。 所以要通知,是因为轮询是不及时的。既要保证及时,又要保证可靠,就只能轮询和异步通知一起上。 因为异步通知的时候,会把轮询需要获得的状态一并携带上了。所以,获得通知后只是取消定时器,让轮询线程立即唤醒干活肯定是。。。 可以的但是有点浪费。如果在异步通知线程里直接调用处理呢,就要把处理的东...

Yaoi-city-here-I-come

腐都我来啦!

TCP拥塞控制

BBR 为啥要对包的发送时机进行调度呢? 是为了防止缓存堆积. 比如对方的接收速率是 1MB/s . 你的本地发送速率可以达到 1.1GB/s . RTT = 500ms, 窗口大小是 500KB. 好, 现在有 500KB 的数据要发送, 那么你是一次性发出呢? 还是把 500KB 分到 0.5s 的时间内匀速发出? 500KB 是 500 个包. 在 10Gbps 的本...

使用邻居的CMCC宽带加速

基于某些特殊原因,我知道邻居家的wifi密码。 但是他家信号在我家虽然能收到,但是比较弱。所以一直没用。最近从newbie获赠了一个叫 Ubnt AirMAX 的山寨产品,有个定向天线。 这使得我可以在家接收邻居家的信号了。于是就开始用啦! 先上图。 这是在阳台装好的效果。这货还支持 POE 供电,非常不错,网线到就可以干活了。 邻居家使用的是CMCC的网络,这是我要连上他家网络...

错误配置的路由器

企业专线宽带通常会分配多个固定IP,一般是 4 个。也有的是 8 个。如何使用这多个IP地址也是一门学问。 我见过的多数企业,对于多个IP的使用基本上就2个模式。 模式1:只使用一个。(通常负责人还会抱怨给那么多地址干嘛,一个就够了,多的不要了,给降价吧!) 模式2:作为NAT地址池。提高大并发下的NAT效率。(这个负责人通常遇到上面那种人会觉得对方没文化,企业上网人数多,NAT端口不...

中国电信原生IPv6配置

目前电信已经商用 ipv6 网络了,ipv6 的好处你懂得。 在继续之前,首先讲下,ipv6 同 ipv4 在配置上的不同。 对于家庭宽带,ipv4 是 pppoe 拨号的时候自动配置的。isp 给且仅给一个 ipv4 地址。 如果有多台设备需要上网,就需要使用一种叫 NAT 的技术进行网址共享。 但是 ipv6 地址有 128位那么长,世上每一粒沙子都能分配一个 ipv6 地址,意思...

高速转发是如何实现的

以太网发展到如今,已经出现了 400Gbps 的传输速度了。在这个传输速度下,实现无阻塞转发,需要达到的转发性能要达到 579.2Mpps x 端口数,要实现无阻塞转发所需要的背部带宽达到 800Gbps x 端口数。没有任何已知的系统总线能提供如此大的带宽。 那么,高速转发是如何实现的呢? 首先,将问题分解,一次转发分解成多个动作,然后看这些动作如何实现。 第一,网络接口收到数据包。...

死在以太网发展道路上的网们

记得 Robert Metcalf(以太网的发明者)说过如果有技术最终替代了以太网,那么它还是会被叫做“以太网” ,所以以太网永远不会消亡。 以太网,诚如它所言,真的像火凤凰一样,不断的涅槃重生,从最初的 3Mbps DIX 以太网到最新的 400Gbps 以太网。历经 10Mbps 100Mbps 1000Mbps 10Gbps 40Gbps 100Gbps 的磨练,一次次的幻化重生。...

脑洞:可编程网卡

很久以前,网卡就只是个物理协议转换装置。各种数据的处理都是靠的 CPU。随着网卡支持的速率的提升,还有人们对效率的追求,网卡开始支持将一些操作给 offload 到网卡上执行。比如checksum的计算。再后来,连 TCP 这样的协议都可以直接交给网卡处理。叫 TCP offload。 网卡能 offload 的东西越多,高网络负载下的 cpu 使用率就越低。数据处理也就越有效率。 既然连...

路由口和交换口

很久以前,我买路由器非常关心路由器有几个口。但是我最终发现,其实路由器都只有2个口。 一个 WAN 口一个LAN口。哪怕是一些双WAN的路由器,其实也只有3个口,2个WAN口一个LAN口而已。 至于你看到的4个LAN口,那不是口,那只是内置了一个交换机。 说道这,就得科普一下 路由口和交换口 的区别。 所谓交换口,就是一个2层可以通的RJ45口。而路由口,才是可以配置 IP 地址的口,...