十年老服务器的“第二春”:廉价高效的存储方案
一家公司仍在生产环境中运行一台使用了十多年的旧文件服务器。这台服务器虽然老旧,BMC 甚至需要 Java 来支持 KVM-over-IP 功能,但由于其拥有 16 个磁盘托架和 10G 以太网端口,以及公司对低成本大容量存储的需求,它被重新利用作为“自带磁盘”的廉价存储服务器。尽管速度和内存较低,但满足了用户的低性能、大容量需求。这体现了在特定情况下,老旧硬件通过合理利用依然可以发挥价值的理念。
阅读更多
一家公司仍在生产环境中运行一台使用了十多年的旧文件服务器。这台服务器虽然老旧,BMC 甚至需要 Java 来支持 KVM-over-IP 功能,但由于其拥有 16 个磁盘托架和 10G 以太网端口,以及公司对低成本大容量存储的需求,它被重新利用作为“自带磁盘”的廉价存储服务器。尽管速度和内存较低,但满足了用户的低性能、大容量需求。这体现了在特定情况下,老旧硬件通过合理利用依然可以发挥价值的理念。
阅读更多
一家大学的研究团队面临一个棘手的系统管理员问题:服务器运行时间过长,需要重启,但频繁重启会影响用户体验。他们通常避免重启,但这次因服务器长时间运行而不得不进行大规模重启。为了避免类似情况再次发生,他们决定制定一个年度重启计划,每年至少重启三次,以配合学校的教学时间表,从而在预防潜在问题与保证用户体验之间取得平衡。
阅读更多
本文探讨了Go语言中联合类型的引入和零值问题。作者认为,理想的联合类型需要支持非空类型,以强制处理空值,避免错误。Go语言目前的零值机制和非空类型的缺失,使得联合类型的引入变得复杂。即使引入支持零值的联合类型,其作用也可能仅限于节省内存,而无法实现像选项类型那样更强大的功能。作者认为,鉴于Go开发者对零值机制的保留态度,Go语言不太可能引入强大的联合类型。
阅读更多
本文探讨了在Go语言中实现类似Rust的Result类型或Option类型的复杂性,特别是在实现类似联合类型(Union Type)的特性时。作者指出,简单的结构体模拟无法达到真正的联合类型效果,因为Go的垃圾回收机制需要知道内存区域的数据类型。在没有编译器和运行时支持的情况下,Go的垃圾回收器无法区分指针和整数,这使得实现真正的联合类型变得困难。虽然可以使用接口类型或unsafe.Pointer,但这可能导致额外的堆分配,效率较低。此外,向Go添加联合类型不仅需要修改编译器,还需要调整垃圾回收、内存分配系统等,因此Go不太可能添加联合类型。
阅读更多
作者探讨了在小型Python程序中使用类型提示的实践经验。作者认为,类型提示强制开发者预先定义数据类型,这在程序开发初期,尤其是不涉及复杂数据结构的小型程序中,反而增加了代码编写的负担。因为在开发过程中,数据结构和类型可能会随着程序演进而变化,频繁修改类型提示显得效率低下。作者更倾向于在代码稳定后再添加类型提示,以便日后维护和修改。
阅读更多
本文探讨了Unix系统中获取和设置终端窗口大小的ioctl和信号机制的历史。4.3 BSD引入了TIOCGWINSZ ioctl和SIGWINCH信号,用于 respectively 获取窗口大小和通知窗口大小变化。文章指出,虽然4.3 BSD推广了这些接口,但它们可能起源于更早的SunOS系统。SunOS早期版本使用SIGWINCH来通知图形程序窗口大小变化,并可能拥有某种形式的窗口大小获取机制,BSD可能借鉴了SunOS的这些特性。
阅读更多
这篇文章探讨了在Go语言中实现类似Promises模式的方法,以解决异步任务执行并按顺序处理结果的需求。作者对比了两种方案:使用单个通道并附加排序信息,以及为每个请求使用单独的回复通道。作者认为,虽然会创建大量通道,但单独回复通道的方式在处理结果顺序方面更加简洁易用。
阅读更多
本文论述了操作系统线程高昂的成本。主要原因在于操作系统内核和用户程序运行在不同的硬件安全域,线程操作需要频繁进行安全域切换,带来额外开销。现代异步IO致力于减少这种切换,从而提升效率。文章还指出,即使使用简化的编程模型,高效的异步IO也能带来显著性能提升。
阅读更多
作者讲述了他们服务器在内核升级后,由于AppArmor被禁用导致Slab内存泄漏,最终导致服务器崩溃。多亏了Prometheus和Grafana的监控和历史数据,他们快速定位问题根源,并通过恢复AppArmor配置解决了问题。这次事件证明了指标系统的重要性,尤其是在故障诊断和快速恢复方面。
阅读更多
这篇文章探讨了SSH作为一种通用的外部访问协议在大学环境中的应用。作者指出,尽管SSH存在安全风险,但在大学环境中,由于人员流动性大,需要从各种设备远程访问系统,SSH成为了最佳选择。与VPN等其他远程访问方式相比,SSH的优势在于其广泛的兼容性和易用性,几乎所有设备和网络环境都支持SSH。
阅读更多
本文探讨了 Linux 系统中两个与文件描述符相关的限制:fs.nr_open 和 fs.file-max,追溯了其历史渊源。作者从早期 Unix 系统的简单设计出发,解释了这两个限制的由来以及它们在现代 Linux 内核中的意义,并阐述了每个限制在资源管理和错误预防方面的作用。
阅读更多
这篇文章分析了一个 Python 闭包的特殊现象:在一个循环中定义并返回闭包函数,如果立即调用这些闭包,返回值会随着循环递增;但如果先收集所有闭包,最后再调用,则返回值都将是循环结束时的最终值。这是因为所有闭包都共享同一个外部变量,而闭包捕获的是变量的引用而非值。文章进一步解释了“立即调用”和“稍后调用”的区别,以及这种区别导致的结果差异。
阅读更多
作者多年来一直在 Ubuntu 服务器上使用 PyPy 运行各种 Python 程序,并通过 pipx 安装到自动管理的虚拟环境中。最近,作者在云服务器上安装了一个大型云供应商 CLI 工具,该工具也运行在 PyPy 上,并且工作正常。作者已经使用 PyPy 多年,没有遇到任何问题,这表明 PyPy 在作为 CPython 的替代品方面已经基本成功。
阅读更多
这篇文章回顾了 Go 语言早期版本中 GOPATH 的设计理念和使用方式,以及它在依赖管理方面的优缺点。作者认为,GOPATH 的设计初衷是合理的,它类似于 Python 的虚拟环境,允许开发者在一个独立的工作空间中管理项目及其依赖项。然而,这种方式也存在一些局限性,例如无法方便地跟踪依赖项的版本变化,以及在不同工作空间之间共享项目较为困难。最终,Go 语言在 1.5 版本中引入了 vendoring 机制,并在后续版本中发展出了 Go Modules 来解决这些问题。
阅读更多
Linux内核开发者最近开始为所有针对稳定内核的错误修复提供CVE,这引起了争议。第三方维护者长期以来一直要求内核标记所有安全修复,以便他们可以将这些修复移植到自己的内核中。然而,可靠地识别错误修复是否为安全修复非常困难。第三方希望内核开发者承担这项工作,但开发者没有义务为第三方免费工作。因此,为所有错误修复提供CVE可以被视为内核开发者的一种应对策略,将责任转移给了第三方。
阅读更多
该网站提供有关 UEFI 和 BIOS 术语的信息。它解释了 UEFI 和 BIOS 之间的区别,并列出了其他常见的 PC 术语,例如 CMOS、GPT 和 MBR。
阅读更多
该网站提供了有关在 Unix 外壳程序中使用空格的指南,重点介绍了空格在命令行解释中的作用,以及如何使用引号和反斜杠来控制空格。文章还提供了使用反斜杠转义特殊字符的示例。
阅读更多
该网站是多伦多大学计算机科学系系统管理员克里斯·科克肖特的博客,重点关注系统管理和网络安全。博客文章涵盖了各种主题,包括系统维护、网络安全最佳实践、故障排除和新技术评论。该网站还提供了一个方便的搜索栏,可搜索特定主题的博客文章。
阅读更多
这篇文章探讨了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却强制运行,导致了问题。
阅读更多