十年老服务器的“第二春”:廉价高效的存储方案

2024-12-17

一家公司仍在生产环境中运行一台使用了十多年的旧文件服务器。这台服务器虽然老旧,BMC 甚至需要 Java 来支持 KVM-over-IP 功能,但由于其拥有 16 个磁盘托架和 10G 以太网端口,以及公司对低成本大容量存储的需求,它被重新利用作为“自带磁盘”的廉价存储服务器。尽管速度和内存较低,但满足了用户的低性能、大容量需求。这体现了在特定情况下,老旧硬件通过合理利用依然可以发挥价值的理念。

阅读更多

定期重启服务器:预防胜于治疗

2024-12-13

一家大学的研究团队面临一个棘手的系统管理员问题:服务器运行时间过长,需要重启,但频繁重启会影响用户体验。他们通常避免重启,但这次因服务器长时间运行而不得不进行大规模重启。为了避免类似情况再次发生,他们决定制定一个年度重启计划,每年至少重启三次,以配合学校的教学时间表,从而在预防潜在问题与保证用户体验之间取得平衡。

阅读更多
开发 定期重启

Go语言的联合类型与零值

2024-12-09

本文探讨了Go语言中联合类型的引入和零值问题。作者认为,理想的联合类型需要支持非空类型,以强制处理空值,避免错误。Go语言目前的零值机制和非空类型的缺失,使得联合类型的引入变得复杂。即使引入支持零值的联合类型,其作用也可能仅限于节省内存,而无法实现像选项类型那样更强大的功能。作者认为,鉴于Go开发者对零值机制的保留态度,Go语言不太可能引入强大的联合类型。

阅读更多
未分类 零值

在Go语言中实现联合类型的复杂性

2024-12-07

本文探讨了在Go语言中实现类似Rust的Result类型或Option类型的复杂性,特别是在实现类似联合类型(Union Type)的特性时。作者指出,简单的结构体模拟无法达到真正的联合类型效果,因为Go的垃圾回收机制需要知道内存区域的数据类型。在没有编译器和运行时支持的情况下,Go的垃圾回收器无法区分指针和整数,这使得实现真正的联合类型变得困难。虽然可以使用接口类型或unsafe.Pointer,但这可能导致额外的堆分配,效率较低。此外,向Go添加联合类型不仅需要修改编译器,还需要调整垃圾回收、内存分配系统等,因此Go不太可能添加联合类型。

阅读更多
未分类 联合类型

我对Python类型提示的实践思考

2024-11-27

作者探讨了在小型Python程序中使用类型提示的实践经验。作者认为,类型提示强制开发者预先定义数据类型,这在程序开发初期,尤其是不涉及复杂数据结构的小型程序中,反而增加了代码编写的负担。因为在开发过程中,数据结构和类型可能会随着程序演进而变化,频繁修改类型提示显得效率低下。作者更倾向于在代码稳定后再添加类型提示,以便日后维护和修改。

阅读更多
未分类

Unix中ioctl和信号关于窗口大小的历史

2024-11-04

本文探讨了Unix系统中获取和设置终端窗口大小的ioctl和信号机制的历史。4.3 BSD引入了TIOCGWINSZ ioctl和SIGWINCH信号,用于 respectively 获取窗口大小和通知窗口大小变化。文章指出,虽然4.3 BSD推广了这些接口,但它们可能起源于更早的SunOS系统。SunOS早期版本使用SIGWINCH来通知图形程序窗口大小变化,并可能拥有某种形式的窗口大小获取机制,BSD可能借鉴了SunOS的这些特性。

阅读更多
未分类 ioctl SIGWINCH

使用Go语言和Promises模式

2024-09-30

这篇文章探讨了在Go语言中实现类似Promises模式的方法,以解决异步任务执行并按顺序处理结果的需求。作者对比了两种方案:使用单个通道并附加排序信息,以及为每个请求使用单独的回复通道。作者认为,虽然会创建大量通道,但单独回复通道的方式在处理结果顺序方面更加简洁易用。

阅读更多
未分类 Promises模式

操作系统线程总是代价高昂

2024-09-07

本文论述了操作系统线程高昂的成本。主要原因在于操作系统内核和用户程序运行在不同的硬件安全域,线程操作需要频繁进行安全域切换,带来额外开销。现代异步IO致力于减少这种切换,从而提升效率。文章还指出,即使使用简化的编程模型,高效的异步IO也能带来显著性能提升。

阅读更多
未分类

Prometheus 主机指标拯救了我们

2024-07-21

作者讲述了他们服务器在内核升级后,由于AppArmor被禁用导致Slab内存泄漏,最终导致服务器崩溃。多亏了Prometheus和Grafana的监控和历史数据,他们快速定位问题根源,并通过恢复AppArmor配置解决了问题。这次事件证明了指标系统的重要性,尤其是在故障诊断和快速恢复方面。

阅读更多

SSH,我们通用的访问协议

2024-07-18

这篇文章探讨了SSH作为一种通用的外部访问协议在大学环境中的应用。作者指出,尽管SSH存在安全风险,但在大学环境中,由于人员流动性大,需要从各种设备远程访问系统,SSH成为了最佳选择。与VPN等其他远程访问方式相比,SSH的优势在于其广泛的兼容性和易用性,几乎所有设备和网络环境都支持SSH。

阅读更多
未分类

带外管理并不简单

2024-07-07

本文探讨了带外网络管理的重要性以及其实施的复杂性。作者以加拿大罗杰斯通信公司2022年大规模网络故障为例,指出缺乏带外管理能力是导致故障严重程度的重要因素。带外管理需要独立的硬件和网络基础设施,并需要考虑冗余性、安全性、身份验证等问题。作者认为,对于资源有限的小型网络,与其分散精力维护两个网络,不如专注于增强单个网络的可靠性和冗余性。

阅读更多
未分类 带外管理

理解 Python 闭包的怪异之处

2024-06-17

这篇文章分析了一个 Python 闭包的特殊现象:在一个循环中定义并返回闭包函数,如果立即调用这些闭包,返回值会随着循环递增;但如果先收集所有闭包,最后再调用,则返回值都将是循环结束时的最终值。这是因为所有闭包都共享同一个外部变量,而闭包捕获的是变量的引用而非值。文章进一步解释了“立即调用”和“稍后调用”的区别,以及这种区别导致的结果差异。

阅读更多
未分类 闭包

PyPy 多年来一直在默默地为我工作

2024-05-30

作者多年来一直在 Ubuntu 服务器上使用 PyPy 运行各种 Python 程序,并通过 pipx 安装到自动管理的虚拟环境中。最近,作者在云服务器上安装了一个大型云供应商 CLI 工具,该工具也运行在 PyPy 上,并且工作正常。作者已经使用 PyPy 多年,没有遇到任何问题,这表明 PyPy 在作为 CPython 的替代品方面已经基本成功。

阅读更多
未分类 PyPy 虚拟环境

Go 语言开发和依赖管理的 GOPATH 故事

2024-05-24

这篇文章回顾了 Go 语言早期版本中 GOPATH 的设计理念和使用方式,以及它在依赖管理方面的优缺点。作者认为,GOPATH 的设计初衷是合理的,它类似于 Python 的虚拟环境,允许开发者在一个独立的工作空间中管理项目及其依赖项。然而,这种方式也存在一些局限性,例如无法方便地跟踪依赖项的版本变化,以及在不同工作空间之间共享项目较为困难。最终,Go 语言在 1.5 版本中引入了 vendoring 机制,并在后续版本中发展出了 Go Modules 来解决这些问题。

阅读更多
未分类 GOPATH 依赖管理

Linux内核为所有错误修复提供CVE:一个可以预见的趋势

2024-05-14

Linux内核开发者最近开始为所有针对稳定内核的错误修复提供CVE,这引起了争议。第三方维护者长期以来一直要求内核标记所有安全修复,以便他们可以将这些修复移植到自己的内核中。然而,可靠地识别错误修复是否为安全修复非常困难。第三方希望内核开发者承担这项工作,但开发者没有义务为第三方免费工作。因此,为所有错误修复提供CVE可以被视为内核开发者的一种应对策略,将责任转移给了第三方。

阅读更多
未分类 linux CVE

Ubuntu系统grub软件包更新问题

2024-04-13

这篇文章探讨了Ubuntu 24.04版本中grub软件包更新失败的问题,尤其是在使用软件RAID根磁盘和BIOS MBR引导的系统上。作者发现,相同的配置在Ubuntu 22.04中可以正常工作,但在24.04中grub-install无法将新的GRUB引导代码安装到根文件系统的设备上。作者深入研究了grub-pc软件包的postinst脚本,发现该脚本复杂且难以理解。作者推测Ubuntu 20.04和22.04在更新grub软件包时可能根本没有运行grub-install,而24.04却强制运行,导致了问题。

阅读更多
未分类 grub