进程是如何创建的?

这次简单总结探究一下 Go 对进程相关操作的封装。 Go 中通过名称或者路径可以很简单的启动一个进程(命令): ret, _ := exec.Command("bash", "-c", "ls -a -l -h").Output() 先来看看 Go 创建运行一个进程大致流程: 将命令、参数,以及环境变量、要运行的工作目录等数据,传递给 `os.StartProce ...

一次网络建设踩坑记

本文不是教程,只做纯技术讨论和问题过程记录与解决。 当前居住地用来上网的机器是一个刷了梅林固件的远古网件路由器,奈何性能和稳定性差,内置的软件也已经没人维护了,很多需求都无法满足,遂准备整备一下当前网络环境。根据以往经验,大思路是路由器只是单纯的使用原厂固件做好本职工作,例如提供 WIFI 以及有线连接,其他特殊需求通过一台 7*24 小时开机的机器(服务器)完成。 机器选择 ...

伪共享

在设计程序、算法、数据结构方面,了解基础的硬件设计构造和知识,有助于帮助我们设计良好性能的程序。同时还能为我们解决问题提供新的思考方向。 以下 Go 性能测试代码,涉及到和硬件相关的问题: type CacheLinePad struct{ _ [64]byte } type testPad struct { A uint32 _ CacheLinePad } type t ...

Go 中的栈

之前在尝试阅读 Go runtime 代码的时候,看到有些函数是需要使用 systemstack 进行执行调用的,例如 runtime 中的监控逻辑 sysmon: systemstack(func() { newm(sysmon, nil, -1) }) Go 中关于 systemstack 的注释也非常简洁明了: // systemstac ...

ESP8266

前一段时间突发奇想想做一个硬件。 需求是这样的:在老家一般太阳能加水都是使用水泵抽到房顶,当水满的时候,关掉水泵的电源。 这样其实显得不够自动化,每次还要人看着,如果有一个硬件能控制,那可真是太棒了,哈哈。从硬件的实现角度来讲也很简单:就是通过水位的变化控制水泵的开关。 注意,接下来的硬件提到到继电器,严肃提示::warning:高压危险:warning:! 硬件选型 作为一 ...

Go 编译器 SSA 中间代码探究

Go 版本:1.15.6 起因 前一段时间,在某个 Go 交流学习群里有一个群友发出下面两段特殊的代码: 代码段 1 : package main import "time" func main() { var i = 1 go func() { time.Sleep(1*time.Second) println(i) }() i = 2 f ...

在 WSL2 环境下安装 BPF 工具链

最近想研究一下 BPF 技术,家里的台式机是 Windows 10 系统,借机想使用一下 WSL,所以就尝试在 WSL 环境下安装 BPF 工具链。但是在安装中遇到了很多困难,网上相关 WSL2 安装 BPF 的资料也难以找到,所以就自己简单研究了一下。 环境 WSL 版本:2 发行版:Ubuntu 20.04.1 LTS Windows 版本:20H2 安装 常规 ...

从一次线上问题排查发现的 fasthttp 设置问题

近期由于新上的一个系统新版本出现了 bug,现象是某个 HTTP 接口会在接受一定量请求之后 hang 住,伴随着产生了大量调用方的超时报警。由于新上的系统不是面向用户的系统,所以要求运维保留现场,关掉了触发问题请求的任务,开始排查问题。 最后找到问题的原因很简单:sqlx 库使用了 Queryx 方法,查询由于只是判断记录是否存在,所以并没有读取返回的 Rows,这就导致了一个问题,就 ...

从 Go 在 macOS 下的一个小问题说起

Go 版本:1.14.4 macOS 版本:10.15.5 从一段代码说起 请看下面 Go 代码: package main import ( "fmt" "time" ) func main() { fmt.Println(time.Now().UnixNano()) fmt.Println(time.Now().UnixNano()) fmt.Pr ...