分类

分类: programming

处理一个 socket: too many open files 问题

大概情况是这样的, 前几天做完离职交接, 今天看到前公司的微信群里消息爆炸了, 用户 无法在微信小程序中下单. 接手后端项目的小胖已经重启了数据库(不晓得他为啥一进服务器 就先把数据库重启了), 说还是不行.

后来另一位同事重启了 consumer 服务, 然后服务就恢复了.

查看了 docker log, 发现了一个 ``dial tcp 127.0.0.1:8202: socket: too many open files 的问题, 但是请求的 http server 也是布署在同一台服务器上, 它们也共享了同一个 docker network, 通常是 不会出现这个问题的, 之后就猜到可能是因为本地的 TCP 端口号被占完了, 或者分配给该进程 的文件句柄数被用光了, http client 无法再发起新的 socket 连接导致的.

阅读全文 "处理一个 socket: too many open files 问题" »

C++ 中的 string slice

最近在读 LLVM 的代码, 发现了它里面也实现了 string slice 字符串引用的功能.

在之前, 已经在 leveldb 以及 re2 中见过类似的实现, 当然, 类似的 功能在 chromium 的代码中有更复制的实现.

之所以这些开源软件中要独立实现一套 string slice, 我觉得有这几个原因:

  • cpp 中要支持 std::string 以及 const char* 这两种字符串类型, 而这两种类型实现的 某些操作方法, 并不一致
  • 标准库中的 字符串类型缺少一些功能
  • 作为值传递时, 尽可能减少内存复制
阅读全文 "C++ 中的 string slice" »

Qt 进程没有被设置语言环境变量时导致文件路径乱码的问题

问题

前几天帮同事调试一个问题, 其表现是这样的:

前端 UI 进程里有个菜单项, 激活之后, 会调用后端的一个 dbus 服务, 这个服务使用 Qt 写的. 菜单会把当前选中的文件的绝对路径传递给后端的这个 dbus 服务, 当路径里有中文 字符时, 路径就不被识别了, 后来经过打印发现, QFileInfo::exists(filepath); 返回 false.

阅读全文 "Qt 进程没有被设置语言环境变量时导致文件路径乱码的问题" »

可重入的函数

可重入的函数有这样的特性: 当该函数被调用时, 不会影响之前的 状态. 它们是线程安全的, 而且也可以在信号处理函数(signal handler) 里面使用. 它们没有副作用.

举例来说, read(), write() 都是可重入的, 因为它们的状态, 比如 缓存, 文件偏移量都是在内核中维护的. 而 fread(), fwrite(), printf(), 这些都不是可重入的. 它们的缓存是由 libc 维护的, 极端的 情况下, libc 在处理缓存时被内核中断了, 触发了信号处理函数, 在信号 处理函数内部, 调用 printf() 时, libc 之前的缓存状态就被修改了.

阅读全文 "可重入的函数" »