编程技巧 - 文章列表
-
Node.js接口响应变慢与事件循环阻塞的排查方法(monitorEventLoopDelay测延迟、UV_THREADPOOL_SIZE调整libuv线程池与worker_threads拆分CPU任务)
Node.js接口慢但CPU不高、内存正常,多半是事件循环被占住。本篇讲用monitorEventLoopDelay量出p99延迟,区分主线程同步阻塞与libuv线程池排队两类成因,梳理JSON大报文、正则回溯、同步加密、nextTick递归等常见写法,给出UV_THREADPOOL_SIZE调整与worker_threads拆分的做法。
-
Java报错Connection is not available, request timed out after 30000ms的排查方法(HikariCP连接池耗尽、连接泄漏定位与maximumPoolSize调整)
HikariCP报Connection is not available, request timed out after 30000ms,多数是连接池被打满。本篇讲清报错括号里total、active、idle、waiting四个数字的读法,用leakDetectionThreshold抓出泄漏堆栈,梳理queryForStream、事务里调外部接口等四种不还连接的写法,以及maximumPoolSize、maxLifetime、keepaliveTime的取值牵制。
-
PostgreSQL报错FATAL: sorry, too many clients already与锁等待的排查方法(pg_stat_activity查连接来源、pg_blocking_pids定位阻塞链与PgBouncer连接池)
应用日志跳出FATAL: sorry, too many clients already时psql往往也连不进去。文章讲怎么用superuser_reserved_connections预留槽钻进去,用pg_stat_activity按state、usename查连接来源,区分idle in transaction这类占槽又挡VACUUM的会话;再给出pg_locks与pg_blocking_pids两条查阻塞链的SQL,以及三个超时参数怎么按角色下发;最后是PgBouncer三种池模式的取舍。
-
Windows蓝屏后stop code的查看与定位方法(MEMORY.DMP与Minidump转储文件分析、事件ID 1001与故障驱动排查)
机器蓝屏重启后,能用的线索只有stop code、Minidump里的dmp文件与事件查看器的1001号事件。文章讲清转储文件生成在哪两个目录、CrashControl注册表项怎么把转储打开、事件ID 41与1001里怎么读BugCheckCode和四个参数,以及0x0000000A、0x0000007B、0x0000007F等常见stop code各自指向什么,再给出WinDbg Preview配符号分析、BlueScreenView与WhoCrashed定位肇事驱动、verifier逼驱动现形的步骤。
-
Go程序CPU占用过高与内存持续上涨的pprof定位方法(火焰图、heap profile与goroutine泄漏排查)
Go服务CPU爬到80%以上或者内存一天涨几百MB下不来时,top只能看到进程号。这篇记录用Go自带的pprof定位到具体函数:端点怎么挂才不暴露公网、top与top -cum的flat和cumulative差别、heap的inuse_space与alloc_space两个视角、用-base做差找泄漏点、goroutine的debug=1与debug=2读法、block与mutex的采样开关,以及Go 1.25、1.26、1.27里新增的相关能力。数据截至2026年10月。
-
PHP Composer报错Your requirements could not be resolved to an installable set of versions的排查方法(composer why-not定位冲突、平台约束与版本约束调整)
composer update报Your requirements could not be resolved to an installable set of versions时,线索全在报错块那几行requires与satisfiable by里。这篇记录怎么区分逻辑冲突与平台约束,用composer why-not、why、show --tree找出堵点,install与update的差异,-w与-W的差别,minimum-stability和repositories造成的包找不到,以及内存不足与Xdebug拖慢的误判。数据截至2026年10月。
-
Python进程内存持续上涨的排查方法(tracemalloc定位分配点、objgraph看对象引用与RSS口径差异)
Python服务RSS持续上涨直到被OOMKiller杀掉(退出码137),排查要先分清RSS、PSS、USS三个口径,再用MALLOC_ARENA_MAX与sys._debugmallocstats排除pymalloc碎片造成的假泄漏,然后用PYTHONTRACEMALLOC=25配合两次快照做差定位分配点,objgraph的show_growth与show_backrefs查引用链,最后落到logging重复addHandler、lru_cache无maxsize等常见泄漏点。附cgroup v2限额读法。
-
Linux服务器iowait偏高与磁盘IO打满的排查方法(iostat与iotop定位进程、await队列分析与脏页回写参数调整)
服务器top里wa很高但CPU空闲,多半是磁盘IO堵了。文中给出固定排查顺序:vmstat看b列确认是否有进程卡在IO上,iostat -x看r_await、w_await与aqu-sz判断堵塞程度,iotop、pidstat与/proc/PID/io定位到进程,biosnoop与blktrace下钻到文件和块层,fio打基线,最后调整vm.dirty_ratio等脏页回写参数与IO调度器。附各参数默认值。
-
C++程序崩溃报0xC0000005访问冲突的定位方法(dump文件抓取、Windbg与AddressSanitizer排查内存越界)
0xc0000005是访问违例,与0xc0000409栈溢出、0xc0000374堆损坏不是一回事。先用注册表LocalDumps的DumpType设为2让系统落完整转储,或者procdump挂在外面等;编译时带/Zi与/DEBUG保留PDB,再用Windbg的!analyze -v、.ecxr与kv读栈。Debug构建靠_CrtSetDbgFlag与/RTC1提前拦,必要时上/fsanitize=address或者gflags整页堆。
-
Nginx报错504 Gateway Time-out的排查方法(upstream timed out定位、proxy_read_timeout与fastcgi_read_timeout配置)
504 Gateway Time-out与502的区别在于后端只是慢,不是挂了。按error.log里upstream timed out尾部的connecting、sending、reading三个词,定位该改proxy_connect_timeout、proxy_send_timeout还是proxy_read_timeout,默认值都是60s,连PHP-FPM时换成fastcgi_read_timeout。再把两个耗时变量打进日志找出慢URL,核对PHP的max_execution_time 30s与MySQL锁等待50s。