大概架构是这样,A 进程监控事件,然后产生图片到一个文件夹,B 进程监控文件夹,并记录生成的事件,其中涉及到转换 bmp 文件为 jpg (源图太大),实际操作过程中,经常会出现图片丢失的情况,或者说源图产生但是图片是空,然后并发高的时候整个进程都很卡,ctrl-C 要好久进程才能结束,卡的时候甚至 ssh 都登录不了,第一次碰到这情况,咋回事呢?
1
chen0520 OP 卡的时候其实 ls 命令也要卡半天才会出结果
|
2
dode 2023-07-17 21:23:02 +08:00 via Android
把这个目录调整到内存目录下去吧,尽快清理不用的文件,注意临界文件没有完全写入完成的问题
|
3
dode 2023-07-17 21:23:52 +08:00 via Android
多个硬盘隔离 IO 读写请求
|
4
fuxkcsdn 2023-07-17 21:59:16 +08:00
所有图片都在一个文件夹内?有做二、三级目录吗?没有的话,当文件多的时候肯定会卡
|
5
flyqie 2023-07-18 00:41:29 +08:00 via Android
硬盘 io 导致的问题?
|
6
documentzhangx66 2023-07-18 08:01:30 +08:00
做开发要经常检查 CPU 使用率、io 负载、网络负载等。
你这种架构需要限制最大事务数量,超过的直接丢掉,或者改为多级架构。前级只做 path str 处理,后级再根据整机负载,慢慢处理图片。 |
7
bwangel 2023-07-18 11:57:27 +08:00
我之前用 go 的 fsnotify 实现监听文件功能的时候,也遇到过使用 CPU 太高的问题。后来的解决方案是加个定时器,隔 10S 再批量处理一下事件,CPU 使用率就降下去了
https://github.com/gohugoio/hugo/blob/387c5f60f97141d638327f84ee426fb44f6c554e/watcher/batcher.go#L60-L78 hugo 中有个 batcher ,也是类似的思路。批量汇集事件之后再处理。 |
8
bwangel 2023-07-18 11:59:19 +08:00
#7
改进之后,监听的目录没有 exclude node_modules, 监听了几万个文件,也没有太大的性能问题。 但我的逻辑很简单,监听到文件修改之后发个 http 请求,没有你的逻辑复杂。 |