proxy代理   soft软件   IT 业界特快   norton 诺顿病毒库   代理列表   search FTP搜索   whois IP地理位置   blog 追求完美  
money理财   life生活   RSS聚合门户   firefox WEB浏览器   免费域名   typeset 假古文   AntiVirus 反病毒   ipcn 站点导航  

« 同学录、校友录客户端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就是这里存在问题
本blog WWW

Posted by windtear at December 14, 2005 10:01 PM

本站使用中的任何问题,请与 windtear @ windtear.net 联系
Copyright© 1999-2024 Windtear. All rights reserved.