木偶's Blog

如果发现能力无法支撑自己的野心,那就静下心来学习吧

fjy89

在 Proxmox 6.5.11-8 中,偶发性会出现以下报错,尤其是在进行大文件传输后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[97377.240263] e1000e 0000:00:1f eno1: Detected Hardware Unit Hang:
TDH <22>
TDT <2f>
next_to_use <2f>
next_to_clean <21>
buffer_info[next_to_clean]:
time_stamp <101725292>
next_to_watch <22>
jiffies <1017253e0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>

一旦出现该问题,Synology NAS 就会进入不可用的状态。

1.1 Intel 网卡驱动问题,特别是 e1000e

错误信息表明网络接口卡(NIC)在进行数据传输时遇到了硬件单元挂起的问题。这种情况在重网络负载时更容易发生。

这是多年来 I219-V、I218-V… 网卡型号及其驱动程序的一个已知错误。不仅在 proxmox 上,在 xcp-ng 上也是如此。

这个问题,截止 Proxmox 6.5.11-8 仍未被彻底解决,只能通过禁用 TCP 校验和卸载。

1.2 解决方案

通过执行命令:ethtool -K eno1 tso off gso off gro off 即可解决,但是每次重启机器或者网卡,都会失效。具体含义下方会说明。

如何长期解决?

/etc/network/interfaces 中,添加以下代码:

1
2
iface eno1 inet manual
post-up /usr/bin/logger -p debug -t ifup "Disabling offload for eno1" && /sbin/ethtool -K $IFACE tso off gso off gro off && /usr/bin/logger -p debug -t ifup "Disabled offload for eno1"
  • post-up:这是一个钩子命令,它会在接口被成功激活(“up”状态)后执行。这里的命令会在 eno1 接口启动之后执行一系列动作。
  • /usr/bin/logger -p debug -t ifup “Disabling offload for eno1”:这条命令使用 logger 程序,将一条调试级别(debug)的信息写入系统日志。日志内容为 "Disabling offload for eno1",标记为 ifup。这样做的目的是记录接口启动时禁用某些功能的动作,方便日后查看系统日志,了解配置是否按预期执行。(可通过 journalctl -t ifup -p debug 查看日志)
  • /sbin/ethtool -K $IFACE tso off gso off gro off tx off rx off:这里使用 ethtool 工具来关闭网络接口的一些“硬件卸载(offload)”功能。具体地:
    • tso(TCP Segmentation Offload):关闭 TCP 分段卸载。TSO 允许网卡将大型 TCP 数据包分段,减轻 CPU 负担。如果关闭,系统会由 CPU 进行 TCP 分段。
    • gso(Generic Segmentation Offload):关闭通用分段卸载。GSO 是一种将不同协议的数据分段处理的技术,关闭它会让系统自己处理分段。
    • gro(Generic Receive Offload):关闭通用接收卸载。GRO 是一种接收数据包处理优化技术。关闭它意味着数据包接收将完全交由 CPU 处理。
    • tx(Transmit Checksum Offload):完全关闭传输时的校验和卸载。网卡不会自动处理数据包的校验和,而是让系统自行处理。
    • rx(Receive Checksum Offload):完全关闭接收时的校验和卸载,网卡不会校验接收到的数据包,需要系统来进行检查。

[!info] 信息

  • TSOGSOGRO 分别用于控制 TCP 分段、通用分段和接收卸载,这三个是针对传输层和网络层的优化。
  • tx offrx off 是更通用的选项,用于关闭整个发送(TX)和接收(RX)的卸载功能。

如果已经关闭了 TSO、GSO 和 GRO,那么 tx offrx off 可能会显得多余,因为这些设置会影响整个数据包的处理,而不只是特定的卸载功能。

在大多数情况下,只需关闭 TSO、GSO 和 GRO 就可以了,tx offrx off 可以根据需要选择是否使用。如果需要彻底禁用卸载功能,可以使用它们,但通常只关闭 TSO、GSO 和 GRO 是足够的。

[!note] 注意
这对于一些系统可能没有生效,那么可以尝试通过注册 Service 的方式执行。这里不赘述。

如何查看 tso、gso、gro 是否已经关闭:ethtool -k eno1 | grep -E 'tso|gso|gro'

yp93w

均为 off,说明已经关闭。

如何查看 TCP 校验和卸载是否开启:ethtool -a eno1

qegq7

些参数主要用于控制网络接口的流量控制,以减少数据包丢失,确保在网络拥堵时网络的稳定性。

  • Autonegotiate:开启表示接口支持自动协商功能,允许网络接口和连接到的设备协商最佳的传输模式(如全双工或半双工)和流量控制。
  • RX(Receive):此项“on”表示接收暂停帧的能力已开启。也就是说,网络接口在接收到暂停帧时会暂停接收数据。这在数据接收方无法及时处理流量时非常有用。
  • TX(Transmit):此项“on”表示发送暂停帧的能力已开启。网络接口可以在需要的时候发送暂停帧,指示对方暂停发送数据。这在本设备负载过高时很有帮助。
  • RX negotiated:表示接收暂停帧的能力已协商开启,表明两端设备在连接时已协商启用了接收流量控制。
  • TX negotiated:表示发送暂停帧的能力已协商开启,表明两端设备在连接时已协商启用了发送流量控制。

配置后,Synology NAS 终于不会再“突发恶疾”了!!!

1.3 参考文献

当 NGINX 的日志文件变得过大时,通常的做法是进行日志切片(log rotation),这样可以防止单个日志文件过大,便于管理和存储。

而 NGINX 自身或者其扩展的模块均不支持类似的功能。 所以 NGINX 日志切片通常需要依赖外部工具来实现,比如 Linux 系统中常用的 logrotate。以下是如何使用 logrotate 对 NGINX 日志进行切片的步骤:

阅读全文 »

OMV NAS & NextCloud搭建私人网盘.webp

OpenMediaVault (OMV) 是一款基于 Debian 的开源网络附加存储(NAS)解决方案,它通过易于使用的界面提供数据存储、备份和共享服务。结合 Nextcloud,用户可以在 OMV 平台上搭建一个功能强大的私人网盘,实现文件同步、分享和协作。这种组合不仅增强了数据的可访问性和安全性,也为个人和小型企业提供了一个成本效益高、隐私保护好的云存储解决方案。通过 Docker 容器或直接安装,OMV 与 Nextcloud 的整合可以轻松完成,满足现代数字生活的存储需求。

阅读全文 »

当我使用 Windows 11 下的 VSCode 启动 Vue 项目时,出现以下报错:

1
2
3
4
5
6
7
8
ERROR  error when starting dev server:                                        
Error: listen EACCES: permission denied 0.0.0.0:5200
at Server.setupListenHandle [as _listen2] (node:net:1800:21)
at listenInCluster (node:net:1865:12)
at doListen (node:net:2014:7)
at process.processTicksAndRejections (node:internal/process/task_queues:83:21)

 ELIFECYCLE  Command failed with exit code 1
阅读全文 »

在 Apache ServiceComb 中,Highway, Vertx, 和 HTTP 都与微服务间的通信有关,但它们之间的角色和关系是不同的。下面是一个简要的描述来解释它们之间的关系:

  1. Highway:

    • Highway 是 ServiceComb 的一个通信协议。它是专为微服务通信而设计的一个高性能的二进制协议。如果两个微服务都支持 Highway,则它们可以使用此协议进行通信,通常会有更好的性能和更低的延迟。
  2. Vertx:

    • Vert.x 是一个为 JVM 提供的工具包,用于构建响应式应用程序。ServiceComb 使用 Vert.x 作为其反应性框架,这使其可以有效地处理大量并发连接和通信。
    • Vert.x 也支持多种通信协议,包括 HTTP/HTTP2 和其他定制协议(例如 Highway)。在 ServiceComb 中,Vert.x 主要用于处理请求/响应的生命周期、非阻塞的 I/O 处理以及提供异步编程模型。
  3. HTTP:

    • HTTP 是一个应用层的通信协议,用于在互联网上传输数据。在微服务架构中,HTTP(特别是 HTTP/2)常被用作微服务间的通信协议。
    • ServiceComb 支持基于 HTTP 的 RESTful 服务通信。这意味着微服务可以使用标准的 HTTP 方法(如 GET、POST、PUT 等)进行通信。

关系总结:

  • Highway 是 ServiceComb 中的一个专用通信协议,主要针对微服务间的高性能通信。
  • Vertx 是 ServiceComb 使用的反应性框架,提供了异步编程模型,并支持多种通信协议(包括 Highway 和 HTTP)。
  • HTTP 是一个标准的通信协议,在 ServiceComb 中,它常被用作微服务间的通信协议,特别是当使用 RESTful 服务时。

基于以上的描述,我们可以看到,Highway 和 HTTP 都是通信协议,但目标和设计思路略有不同,而 Vert.x 是提供通信框架和异步处理能力的库。

Java

Java 语言普遍用于开发各种类型的软件系统、应用程序和 Web 服务,包括财务软件系统、社交网络软件、移动应用程序(虽然现在多用 Kotlin)、虚拟现实系统、嵌入式系统、大数据应用程序等。

此外,Java 还常用于开发游戏服务器和游戏客户端、智能家居软件和安全相关软件。

Go

Go 语言很适合构建高性能的高并发的服务,可以在游戏、金融、物联网、系统工具等方面得到应用。Go 语言还可以开发分布式系统,构建容器、虚拟化、存储等云计算基础架构。因此 Go 语言可以用于以下任务:

  1. 后端服务:可以用 Go 语言构建高性能和高并发的后端服务
  2. 游戏开发:可以使用 Go 语言开发游戏;
  3. 网络编程:可以使用 Go 语言编写网络编程代码;
  4. 云计算:Go 语言可以编写容器、虚拟化、存储等基础云计算架构;
  5. 工具库:用 Go 语言可以构建各种高效工具库。
  6. 脚本语言:类似 Python 和 Shell

此外,Go 易学快捷,而且可以完成高效的字节码编译,所以适合建立大型应用系统和分布式系统。

Python

Python 语言常用来做程序开发/应用开发、桌面开发(PyQt)、网络编程、Web 开发、科学计算、自动化测试、人工智能、大数据等任务。

此外,Python 还可以用来编写游戏,移动应用等,但很少被用来做这类事情。

1.1 问题描述

docker 导入镜像 tar 包报错,报错信息如下:

image-20221201153103996

1.2 解决方案

通过报错信息可以看出,是导入的时候,docker 对 SHA256 哈希码进行校验,没有校验通过,说明这个镜像 tar 包被修改过。为了验证,我们可以利用 MD5 对镜像进行比对

  1. 在通过 docker save 镜像名称/id -o demo.tar 命令导出镜像 tar 包后,计算出 tar 包的 MD5 值

    1
    md5sum demo.tar  # md5sum 是 Linux 自带的命令
  2. 将 demo.tar 从 Linux 下载下来后,再次对 demo.tar 计算 MD5 值

    1
    certutil -hashfile demo.tar MD5  # certutil 是 Windows 自带的程序

计算后,对比上面两步的 MD5 值,如果不一致,说明从 Linux 将 demo.tar 包下载下来时,可能因为网络等原因,导致数据发生了改变,从而产生这个错误。只需要重新从 Linux 下载 demo.tar 即可,下载后再次计算 MD5 进行对比,直到一致。

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass

问题描述

在使用 Spring 集成的 cglib 手动对某个类进行代理增强时报了以下错误:

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not “opens java.lang” to unnamed module @5c29bfd

我的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class CglibProxyForMultiInterfacesTest {
interface Service1 {
void m1();
}

interface Service2 {
void m2();
}

public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(new Class[]{Service1.class, Service2.class});
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法:" + method.getName());
return null;
}
});

Object proxy = enhancer.create();
if (proxy instanceof Service1) {
((Service1) proxy).m1();
}
if (proxy instanceof Service2) {
((Service2) proxy).m2();
}
System.out.println(proxy.getClass());
for (Class<?> anInterface : proxy.getClass().getInterfaces()) {
System.out.println(anInterface);
}
}
}

解决方案

貌似是高版本的 JDK 禁用了反射权限,需要添加 JVM 参数去开启

1
--add-opens java.base/java.lang=ALL-UNNAMED  

image-20221128141538748

0%