某个项目,因为监控尚不完善,所以我时常会人肉查查状态,终于有一天发现了异常:
如图所示,服务器发送了大量的 reset,在我 watch 的时候还在发,多半有问题。
某个项目,因为监控尚不完善,所以我时常会人肉查查状态,终于有一天发现了异常:
如图所示,服务器发送了大量的 reset,在我 watch 的时候还在发,多半有问题。
某个项目把服务器从 CentOS 操作系统从 5 升级到了 7(3.10.0-693),一切都很顺利,直到我在服务器上闲逛的时候,无意间发现了一个「大问题」:网卡 eth0 在 RX 上存在丢包(dropped)现象,丢得还很有规律,每一两秒丢一个包!
关于 OpenResty 里的 ngx.on_abort,官方文档里是这样说明的:
Registers a user Lua function as the callback which gets called automatically when the client closes the (downstream) connection prematurely.
所谓「代码热更新」,是指代码发生变化后,不用 reload 或者 graceful restart 进程就能生效。比如有一个聊天服务,连接着一百万个用户的长连接,所谓代码热更新就是在长连接不断的前提下完成代码更新。实际上因为所有的 require 操作都是通过 package.loaded 来加载模块的,只要代码是以 module 的形式组织的,那么就可以通过 package.loaded 实现代码热更新,并且基本不影响性能。
了解 OpenResty 的人应该知道,OpenResty 原本的 API 都是基于 C 实现的,不过在新版里都已经改成了基于 FFI 实现的,为什么这么做?因为 FFI 在效率上更有优势,除此以外,FFI 还有一个优点是可以很便利的和 C 交互,我们不妨设想一下,C 语言有那么多成熟的库,通过 FFI,我们可以轻而易举的引入到自己的应用中,何乐而不为呢?
一个 OpenResty 的接口报错了,我查了一下日志,发现如下报错信息:
bad argument #1 to ‘test’ (string expected, got userdata)
看上去这就是一道送分题啊:无非就是 test 函数的第一个参数类型应该是 string,实际传递的却是 userdata。就当我觉得可以轻而易举解决问题的时候,突然发现 test 函数定义就没有参数,调用的时候也没传参数,真是太诡异了。
因为 Lua 本身并没有继承之类的语法,所以我们不能通过 OOP 的套路来扩展模块,不过实际上对于 Lua 来说,扩展一个模块有更简单的方法,下面我们以 lua-resty-string 模块中的 aes 加解密功能为例子来说明一下。
关于 OpenResty 的 cosocket,文档里有如下一段描述:
the cosocket object here is full-duplex, that is, a reader “light thread” and a writer “light thread” can operate on a single cosocket object simultaneously (both “light threads” must belong to the same Lua handler though, see reasons above). But you cannot have two “light threads” both reading (or writing or connecting) the same cosocket, otherwise you might get an error like “socket busy reading” when calling the methods of the cosocket object.
简单点儿说,cosocket 是全双工的,如果同一个 lua handler 有一个读线程和一个写线程的话,那么它们可以同时操作一个 cosocket 对象,但是如果两个线程一起读或者写一个 cosocket 对象的话,那么会触发「socket busy」错误。
如果要选 Linux 下最容易被忽视的命令,time 应该算一个。简单来说,它是一个用来计算命令运行时间的工具,之所以说它容易被忽视,一方面很多人根本不知道 time 的存在,而是习惯在命令启动前后记录两个时间戳,然后手动计算命令运行时间;另一方面很多人虽然知道 time 的存在,但是却并没有真正理解它的含义。