日常编程奇葩又常规问题总结

发布时间 2023-09-20 19:00:54作者: ywx-super

  相信大家在日常编程中遇到过不少奇葩问题,第一反应就是不可能,怎么可能会出现这个问题呢?于是抓耳挠腮,带着充满疑惑的问题,四处寻找答案。其实遇到问题并不可怕,可怕的是我们缺少解决问题的信心,正所谓只要思想不滑坡,办法总比困难多。解决问题才是打工人的价值所在,也是个人价值展现的机会。

  好了,话不多说,回归主题,本篇是我平时遇到的一些奇葩问题总结,包括同事遇到的问题,只要够奇葩,够古怪,够新颖,会持续收纳更新,建议各位小伙伴关注收藏,以后解决古怪问题、避免踩坑会有很大帮助,并且作为解决问题方法和经验的丰富也是挺不错的。

  • 问题1  路径正确,并且文件存在,为啥fopen打开失败 ?

   文件打开失败,打印 strerror(errno),提示 No such file or directory,打开本地目录,文件明明存在,为啥提示文件不存在呢?

   问ChatGPT也不好使,回答的都是常规解答的套话,经过一顿网络搜索,最后找到可能使用 chdir、chroot 函数改变了当前工作目录,于是乎整个工程中搜索通缉 “chdir”、"chroot",但遗憾的是没有找到,然后确认每个链接的库的源代码中进一步查找,最后在 miniunz.c 中找到,解压开始时使用 chdir 函数设置当前工作目录,解压完之后再使用 chdir 还原,这个过程中如果刚好使用相对路径打开文件就会失败。

   解决方法:打开文件改为使用绝对路径。

  • 问题2  Socket 函数返回的描述符怎么是 0 ?

   File Descriptor 0、1、2 分别为标准输入、标准输出、标准错误 用的描述符,3及以上则为常规描述符,返回 0 描述符,系统是不是有什么大病鸭!

   其实不是哈,通过仔细分析代码,后面找到问题原因:关闭 socket 时,将文件描述符赋值为0,二次关闭时,就把标准输入文件描述符给关闭了,后面在调用socket函数,发现0是空闲的,于是就分配给了新的套接字。造成这个问题的本身其实是二次释放问题,类似 double free。

   解决方法:修改关闭逻辑,避免二次释放。

  • 问题3  Tcp程序挂掉或重启后,端口为啥不生效?

   这个问题其实比较常见的,对于有点网络编程经验的同学应该都知道,tcp断开后,连接处于 Time Wait 状态,虽然关闭了fd(close的一端表示后面不再发送数据,但是还可以接收),但是连接并未完全释放,此时端口仍被占用。

   PS:MSL为报文的最大生存时间,RFC 793 中规定MSL时间为 2min,为了保证关闭后消息能送达,TCP 的 Time Wait 状态设为 2MSL 等待时间。

   解决方法:连接时使用端口复用。

  • 问题4 某源码返回错误,提示 Too many open files ?

   在使用 ACL Redis 连接池时,程序运行一段时间后,从连接池获取连接时出错,提示 Too many open files.

   这个问题也比较常规,在文件描述符泄露时,直到使用完,再打开文件就会报这个错,由于每次从连接池中取连接对象时,用完没有放回池中,导致连接对象中包含的 socket 连接描述符泄露。问题根因其实对源码接口不熟,使用不当造成的。

   如果没有泄露 fd,仍然报这个错,那就是资源不足了,这个时候可以修改系统配置 vim /etc/sysctl.conf,通过修改 fs.file-max 、soft nofile、fs.nr_open 这三个参数的值来修改进程能打开的最大文件描述符数量,默认最大描述符一般为 1024,可以 ls -l /proc/pid/fd/ 查看当前进程正在使用的fd。

   解决方法:从连接池中对象中每次 peek 出连接对象,用完再 put 连接对象放回池中。

  • 问题5  程序被OOM干掉 ?

     你的线上程序有没有在某个深夜突然被 kill 掉,然后接到电话前往公司救火,相信有不少小伙伴遇到过,这个问题非常常见,一般就是内存泄露,导致内存用完,或者申请大内存,系统资源不足,表现出的结果就是内存不够,被系统 Out of memory 机制  kill 了。这两种原因在我开发的这几年中都遇到过,第一种情况是写文件没有正常关闭,系统缓存中存在大量待写入文件的内存数据,久而久之内存被榨干了;另外一种情况是在 new 一个 kafka 对象时没有申请到大内存失败。

   解决方法:避免内存泄露,减少内存碎片,防止申请大内存失败,另外,也可增加内存条。

   

  另外,还有一些经典问题没有写上,后面有空再补充,欢迎关注评论,提出一些类似宝贵问题,我们一起学习成长。

  最后,附上一句励志语录 “哪里有客户痛点,哪里就有创业者机会”,与君共勉。

 

本文作者:博客园博主 KeepHopes,对大数据、人工智能领域颇感兴趣,请多多赐教!
原文链接:https://www.cnblogs.com/yuwanxian/p/17717768.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处,谢谢!