banner
按时间整理的学习笔记。

文章归档

Scroll down
Linux开发

一、先确认问题边界

网络问题最怕一上来就改配置。排障前先确认边界:是本机不能访问外部,还是外部不能访问本机;是所有域名都失败,还是只有某个服务失败。

一、日志为什么需要治理

日志是排查线上问题最直接的证据,但不加治理的日志也会带来风险:

  • 文件无限增长,磁盘被写满。
  • 多进程写同一个文件,内容交错。
  • 日志级别混乱,关键错误被淹没。
  • 服务重启后旧日志无法关联。
  • 没有采集和告警,问题只能靠人工发现。

日志治理要解决三个问题:写到哪里、保留多久、怎么发现异常。

一、发布不只是复制文件

很多程序本地能跑,但上线后容易出问题,原因通常不是代码本身,而是发布流程不规范。

一个可靠发布流程要解决:

  • 发布哪个版本。
  • 发布哪些文件。
  • 配置放在哪里。
  • 日志怎么看。
  • 失败怎么回滚。
  • 依赖库是否齐全。
  • 启动和停止是否可控。

一、为什么要规范工程结构

小 demo 可以一个 main.c 加一条 gcc 命令解决,但真实项目会有多个模块、多个库、测试、安装和部署。工程结构不清晰,后期会很难维护。

一个比较常见的 C/C++ 项目结构:

1
2
3
4
5
6
7
8
9
10
11
my_app/
├── CMakeLists.txt
├── include/
│ └── my_app/
│ └── version.h
├── src/
│ ├── main.c
│ └── version.c
├── tests/
│ └── test_version.c
└── README.md

一、为什么要重视内存

Linux 应用运行时间越长,内存问题越容易暴露。短时间测试正常,不代表长期运行稳定。内存泄漏、越界访问、重复释放、use-after-free 都可能导致崩溃、性能下降或系统被 OOM killer 杀死。

常见内存问题:

  • 内存泄漏。
  • 空指针访问。
  • 数组越界。
  • 重复释放。
  • 释放后继续使用。
  • 栈空间不足。
  • 内存碎片。

一、为什么要服务化

一个程序能在终端运行,不代表适合部署。真正部署到 Linux 设备或服务器时,需要解决:

  • 开机自动启动。
  • 异常退出自动重启。
  • 统一查看日志。
  • 使用非 root 用户运行。
  • 控制启动顺序。
  • 优雅停止。

Linux 现代发行版通常使用 systemd 管理服务。

一、为什么需要 epoll

阻塞 socket 服务端一次只能等待一个连接或一个读写事件。客户端数量少时问题不大,但连接数变多后,多进程和多线程模型会带来上下文切换、内存占用和调度开销。

Linux 下高并发网络服务常用 epoll

epoll 适合:

  • 大量连接。
  • 多数连接空闲。
  • 事件驱动服务端。
  • 长连接服务。

一、什么是 IPC

IPC 是 Inter-Process Communication,也就是进程间通信。Linux 中每个进程默认有独立地址空间,一个进程不能直接访问另一个进程的内存。如果多个进程需要协作,就需要 IPC。

常见 IPC 方式:

  • 管道 pipe。
  • 命名管道 FIFO。
  • 信号 signal。
  • 共享内存 shared memory。
  • 消息队列 message queue。
  • Unix Domain Socket。
  • TCP/UDP socket。

一、为什么调试能力很重要

Linux 应用开发真正的难点不只是写代码,而是程序出问题时能不能定位。程序可能在你的机器上正常,在服务器上崩溃;可能测试环境正常,生产环境慢;也可能偶发死锁、内存泄漏、文件句柄耗尽。

调试和排错要形成固定流程:

1
确认现象 -> 收集信息 -> 缩小范围 -> 验证假设 -> 修复 -> 回归

一、网络编程先理解什么

Linux 网络编程的核心是 socket。socket 是应用程序访问网络的接口,HTTP、WebSocket、RPC 等上层协议最终都建立在 socket 之上。

入门需要先理解:

  • IP:主机地址。
  • 端口:进程提供服务的入口。
  • TCP:可靠字节流。
  • UDP:无连接数据报。
  • 服务端:监听端口,等待连接。
  • 客户端:主动连接服务端。
12
请输入关键词进行搜索