« 同学录、校友录客户端Alumni 0.14 b1212 发布 更新了http://alumni.ipcn.org/ | Main | Google个性化主页介绍 http://www.google.com/ig?hl=zh-CN »
December 14, 2005
squid access log部分的处理流程和buffer处理
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。 https://windtear.net/archives/2005/12/14/000854.html http://windtear.net/archives/2005/12/14/000854.html 昨天改patch 提一下squid access log部分的处理流程和buffer处理 buffer 就是利用内存比硬盘I/O快的原理 尽量减少I/O次数 数据在内存中积累一定数量之后再写到硬盘 《APUE Second Edition》 Section 3.9 I/O Efficiency 比较了不同大小 BUFFERSIZE 情况下读 Section 5.4. Buffering 介绍了 buffering 相关原理、类型、实现 Section 5.12. Implementation Details Figure 5.11. Print buffering for various standard I/O streams 提了具体细节 关于squid access log处理这块 本身squid是不存在问题的 改patch是因为之前的patch有问题 (考虑不充分提前return造成的) 具体patch就不提了 这里提一下 squid log 的buffer处理 include/autoconf.h /* Define if you have the memcpy function. */ #define HAVE_MEMCPY 1 include/config.h #ifdef HAVE_MEMCPY #define xmemcpy(d,s,n) memcpy((d),(s),(n)) #elif HAVE_BCOPY #define xmemcpy(d,s,n) bcopy((s),(d),(n)) #elif HAVE_MEMMOVE #define xmemcpy(d,s,n) memmove((d),(s),(n)) #endif src/logfile.c Logfile * logfileOpen(const char *path, size_t bufsz, int fatal_flag) void logfileWrite(Logfile * lf, void *buf, size_t len) void logfileFlush(Logfile * lf) static void logfileWriteWrapper(Logfile * lf, const void *buf, size_t len) void logfilePrintf(Logfile * lf, const char *fmt,...) src/access_log.c void accessLogInit(void) logfile = logfileOpen(Config.Log.access, MAX_URL << 1, 1); logfileOpen时设置了 8192 字节的buffer (MAX_URL=4096) 然后accessLogSquid、accessLogCommon通过logfilePrintf调用logfileWrite logfileWrite判断buffer是否满了决定要不要logfileFlush logfileFlush其实只是在执行logfileWriteWrapper之后把lf->offset置0 lf->offset = 0; 如果没有这个 直接后果后果就是导致断言失败 assert(lf->offset <= lf->bufsz); 通过这个流程也就明白了细节逻辑和注意事项 原来的patch就是这里存在问题 |
Posted by windtear at December 14, 2005 10:01 PM