Sucha's Blog ~ Archive for May, 2020

20年5月23日 周六 08:56

修改 m_net 在 Windows 下使用 ewpoll 作为底层事件通知

之前 m_net 在 Windows 下是使用 select 作为 socket 事件检测接口,效率差是一方面,主要是其他更主要的服务端平台,比如 Linux/FreeBSD,以及开发常用的 MacOS,是另外一套相近的 API。

比如不管是 epoll 或者 kqueue,通过接口,可以返回一个当前时间片段内有事件发生的 socket 列表,以及 socket 对应的 ptr,用来绑定这个 socket 对应的内部结构。添加、删除 socket 事件列表的方法也相近。

然而 Windows 这边,因为用了线性的 select,内部数据结构映射方面,每次监听前,都得添加事件响应参数,又得单独处理,麻烦了很多。

后面介绍的这个 wepoll,是在 Windows 下实现了 epoll 的接口,对那些志在跨平台的网络库来说,简单点只需要面对 epoll、kqueue 的区别就好了,而这两者很相近啊。

所以稍微修改了一下,m_net 就支持上了,另外还修复了一个大 bug,epoll_wait 接口的参数是 milliseconds 的,而 kqueue 的接口参数是 microseconds 的,fix 了一下。

然后跑了 test_reconnect、test_rwdata、test_timer 几个端对端的测试程序,完美应用。当然回头又跑了一遍 Linux、FreeBSD、MacOS 的下的端对端测试。

话说 wepoll 在 Windows 下使用的也是 IOCP 对应的接口,不过没有使用到多线程,而是使用了 SetFileCompletionNotificationModes 函数取消端口操作完成后的异步通知,然后使用 NtDeviceIoControlFile 来获取端口的完成状态,这样就将异步事件转成同步的了。

另外一个部分,是将 epoll 相关接口的数据结构映射到 Windows 相关数据结构里面,大概就是这样。

很想说 NtDeviceIoControlFile 在 bing 上面都搜不到什么中文信息,蛋疼。

20年5月17日 周日 11:28

改用 Visual Studio Code 作为编辑器

为了应用上 VSCode 的 Markdown All in One,之前诸如 2020-05 这样的文件名,都修改为 2020-05.md 了。对于整站来说,算是很大的改变,虽然实际的操作只是一条普通的 find 命令。

之前使用的基于浏览器的版本自动变为备份选项了。

VSCode 的 Markdown 功能比如 preview 很方便,另外各种加载、保存操作效率要高很多,而且还是全平台支持(Win、Mac、Linux),因此用了几次之后,就下定决心切换了。但是有个前提,也许是 VSCode 编辑器框架的配置,要进入各种 Markdown 功能,需要识别这个文件为 Markdown,在 VSCode 里面,是通过判断文件名的后缀为 .md 做到的。

为此修修补补了 MarkdownProjectCompositor 以及配置文件,之前验证了一下 html 的输出都没变化,算是验收通过了。

先补个图:

使用VSCode的截图

20年5月17日 周日 11:24

MarkdownProjectCompositor 加入文件名映射配置

之前的 MarkdownProjectCompositor 仅仅支持在 config.lua 配置文件中设置 suffix 为 ".html" 这样的,其实很不方便,特别是如果文件后缀名为 ".md" 的时候,就会很尴尬。

所以重新配置了下面的映射函数来做这层转换

destname = function(input_name)
    return output_name
end

为了适应这个变化,之前主站、blog 目录的好些自动生成文件的功能都得做调整,毕竟之前只有一层以映射,现在多了一层映射,要配置过来,还好,2 个小时就搞定了。

话说,着应该是很普遍的功能,为啥之前没有想到呢。

20年5月17日 周日 11:12

mon_sched 支持 kill child process

mon_shced 升级到了 1.3.4,支持 kill 掉 group process 中的某个 child process,同时也支持单独输出某个 child process 的 pid 到指定目录下。

先列一下功能:

Usage:
mon_sched -h                             show help
mon_sched -v                             show version
mon_sched -r sched_json                  run group process from config
mon_sched -s pid_json                    show group and child status
mon_sched -k pid_json [child_name]       kill [group | child] process

第二个功能先不表,也不知道为啥头脑发热做了第二个功能,说一下第一个功能吧。

之前 mon_sched 只支持 supervision,后来加了 -k 选项,可以关闭管理的整个 process group,这里只是方便了一点,不用自己再使用 kill 指令安排了。主要的应用场景,是为了在远程控制时,将固定的配置文件名,作为 mon_sched 的参数,让整个 process group 下线。

加入第一个功能 kill child process 后,结合本来每个 child process 可以配置其 restart 脚本内容这个功能,可以做到让服务更新,之后再重启。由于 mon_sched 没有什么依赖,因此这样的重启可以做到 child process 二进制依赖的切割。

我自测的结果,即便 mon_sched 在当前目录运行配置文件,restart 脚本删除并重新建立这个目录,mon_sched 重新拉起服务的过程中,仍能定位到这个目录,前提当然是目录名称未变。感觉,在文件系统当前目录这一层,也是没有变化的。

有了这样的加持,方便多了。