tx面试题 设计一个高并发的日志系统

pcvvv 2014-08-23 12:38:42

一个大于10K并发的web服务器,记录访问日志,每条记录不超过60字节。如何设计日志系统?
...全文
5426 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
最勇敢的鸟 2015-03-10
  • 打赏
  • 举报
回复
引用 5 楼 ldh911 的回复:
高并发中,Log4j表现不是很好,以前基本自己写记录器,现在转Logback。 同意4楼观点,1个服务线程1个日志文件其实也挺好。
请问logback与log4j2哪个好?最近在做选型,比较纠结这个问题
姜龙 2015-01-26
  • 打赏
  • 举报
回复
虽然我不太懂C 可以这么假设 如果不用服务器 直接在tcp上写无阻线程的话 10*1000*60+这么大的数据量秒内能写得完么?持续这么大的数据量过来堆积也会很多吧 写日志这种事情应该多cpu的要求不是太高吧 而是对硬盘要求比较高 单台服务器的硬盘肯定是不好满足的 个人拙见可以这样 做一个服务器集群 多台机器 cpu不需要太高 硬盘稍好点儿就行 用集群内的多个服务器去写日志 当然写到自己服务器下的日志文件下即可 然后用另外一台服务器将集群内的日志进行拼接整合以及后续操作(当然可以用别的服务器将这些操作功能分割也可以),这样将单台服务器压力转移到多台服务器 而且每台服务器磁盘读写也能较大花的利用 一点点想法 不对的地方望见谅和指正
密码测试 2014-12-02
  • 打赏
  • 举报
回复
可以考虑用消息中间件,实现异步的消息记录,ActiveMQ就不错。
pcvvv 2014-11-23
  • 打赏
  • 举报
回复
引用 2 楼 ldh911 的回复:
1W并发规模,预计会有100~500条服务线程,可以考虑同时切分为100个日志文件,将日志记录长度定长为60字节;5条服务线程共享一个日志文件。 每隔1小时或更长,切换到新的日志目录。 另外有批量日志处理程序负责将日志搬移合并归档或直接写入数据库以便检索利用。
这里说的服务线程是值专门写日志的线程?那提供web服务的线程或者进程会有多少呢?
okkk 2014-11-04
  • 打赏
  • 举报
回复
引用 18 楼 skgary 的回复:
[quote=引用 14 楼 okkk 的回复:] [quote=引用 10 楼 okkk 的回复:] 1:不用web服务器,直接在tcp上开发无阻塞程序 2:不用数据库,直接按照60字节分段写入日志 [可以考虑建立时间快速访问索引文件] 做到上面两条 20K 并发的系统无压力。 注意管理一下长连接,header及http参数相关处理函数的性能,30K并发量有希望。[普通PC机哈,不是说服务器]
写磁盘又不是写数据库,不需要关心次数,只需要关心流量就好了。就普通PC机来说磁盘的速度应该超过网卡的速度,所以不用担心磁盘的写入问题。 对于服务器来说可能需要计算一下网卡的速度和磁盘速度的匹配问题。 和你说的相反, 这种日志型文件在写入的时候肯定需要在文件打开参数中设置“writethrough”参数,避免文件缓存。在大规模读取的时候反而需要缓存命令,并对命令进行排序,以便顺序完成文件读取。 [/quote] 事实上,网卡的速度就是比硬盘的速度快。 哪个硬盘能写到1Gb以上的。 硬盘的标称值都是连续读速度,但是加上寻道时间,根本不可能到那标称值。[/quote] 这里 “匹配”  的意思就是不用太好的服务器。就像上面我计算的情况,一台性能好一点的PC服务器就足够用了。30K的并发连接,对于普通软件系统足够用了。但对于TX可能有不少问题,估计他们更愿意用UDP协议,在应用层保证数据完整性;这样到达百万级的连接数并不太难。所以这个面试题后面还有好几个层级的问题可以扩展。
zihua2005 2014-10-28
  • 打赏
  • 举报
回复
说下我们的实现思路,看看对你有没有帮助,我们是把日志通过线程池 发到 消息服务器上的,消息服务器负责中转,有专门的消息接收者,将消息统一写到日志文件中,日志文件大小每个控制在50M;每天拆分出若干日志文件,有单独线程来对文件进行处理,看你最终用的持久化方式了,我们是分表 放到sqlserver中,为其他部门提供统计分析.
hehongbo7632566 2014-10-27
  • 打赏
  • 举报
回复
大于10K并发,每条记录60字节。是不是意味着短时间(比如500ms或者1000ms)内就能产生600M甚至更多的日志文件。查资料了解到log4j在高并发的情况下日志会杂乱无章。 楼上说的这个方法个人觉得不错。我们的意思是一个进程里就一个专门写日志的线程,其他的线程要写日志,就发消息给这个写日志的线程。不过这个写日志的线程的线程怎么设计又是个不小的问题了。。。。。
hehongbo7632566 2014-10-27
  • 打赏
  • 举报
回复
mark 下
okkk 2014-10-27
  • 打赏
  • 举报
回复
引用 10 楼 okkk 的回复:
1:不用web服务器,直接在tcp上开发无阻塞程序 2:不用数据库,直接按照60字节分段写入日志 [可以考虑建立时间快速访问索引文件] 做到上面两条 20K 并发的系统无压力。 注意管理一下长连接,header及http参数相关处理函数的性能,30K并发量有希望。[普通PC机哈,不是说服务器]
。。。。。。。。。。。。。
okkk 2014-10-27
  • 打赏
  • 举报
回复
引用 10 楼 okkk 的回复:
1:不用web服务器,直接在tcp上开发无阻塞程序 2:不用数据库,直接按照60字节分段写入日志 [可以考虑建立时间快速访问索引文件] 做到上面两条 20K 并发的系统无压力。 注意管理一下长连接,header及http参数相关处理函数的性能,30K并发量有希望。[普通PC机哈,不是说服务器]
写磁盘又不是写数据库,不需要关心次数,只需要关心流量就好了。就普通PC机来说磁盘的速度应该超过网卡的速度,所以不用担心磁盘的写入问题。 对于服务器来说可能需要计算一下网卡的速度和磁盘速度的匹配问题。 和你说的相反, 这种日志型文件在写入的时候肯定需要在文件打开参数中设置“writethrough”参数,避免文件缓存。在大规模读取的时候反而需要缓存命令,并对命令进行排序,以便顺序完成文件读取。
skgary 2014-10-27
  • 打赏
  • 举报
回复
引用 14 楼 okkk 的回复:
[quote=引用 10 楼 okkk 的回复:] 1:不用web服务器,直接在tcp上开发无阻塞程序 2:不用数据库,直接按照60字节分段写入日志 [可以考虑建立时间快速访问索引文件] 做到上面两条 20K 并发的系统无压力。 注意管理一下长连接,header及http参数相关处理函数的性能,30K并发量有希望。[普通PC机哈,不是说服务器]
写磁盘又不是写数据库,不需要关心次数,只需要关心流量就好了。就普通PC机来说磁盘的速度应该超过网卡的速度,所以不用担心磁盘的写入问题。 对于服务器来说可能需要计算一下网卡的速度和磁盘速度的匹配问题。 和你说的相反, 这种日志型文件在写入的时候肯定需要在文件打开参数中设置“writethrough”参数,避免文件缓存。在大规模读取的时候反而需要缓存命令,并对命令进行排序,以便顺序完成文件读取。 [/quote] 事实上,网卡的速度就是比硬盘的速度快。 哪个硬盘能写到1Gb以上的。 硬盘的标称值都是连续读速度,但是加上寻道时间,根本不可能到那标称值。
assiwe 2014-09-22
  • 打赏
  • 举报
回复
最主要的我觉得应该是内存缓存, 不能直接有日志就写硬盘.得先存在内存里, 每隔几百毫秒或者每隔多少K从内存输出到硬盘里.
skgary 2014-09-13
  • 打赏
  • 举报
回复
引用 10 楼 okkk 的回复:
1:不用web服务器,直接在tcp上开发无阻塞程序 2:不用数据库,直接按照60字节分段写入日志 [可以考虑建立时间快速访问索引文件] 做到上面两条 20K 并发的系统无压力。 注意管理一下长连接,header及http参数相关处理函数的性能,30K并发量有希望。[普通PC机哈,不是说服务器]
一般传统硬盘每秒写不了20K次的,有buffer才有可能。。。
okkk 2014-09-12
  • 打赏
  • 举报
回复
1:不用web服务器,直接在tcp上开发无阻塞程序 2:不用数据库,直接按照60字节分段写入日志 [可以考虑建立时间快速访问索引文件] 做到上面两条 20K 并发的系统无压力。 注意管理一下长连接,header及http参数相关处理函数的性能,30K并发量有希望。[普通PC机哈,不是说服务器]
skgary 2014-08-24
  • 打赏
  • 举报
回复
引用 8 楼 pcvvv 的回复:
[quote=引用 5 楼 ldh911 的回复:] 高并发中,Log4j表现不是很好,以前基本自己写记录器,现在转Logback。 同意4楼观点,1个服务线程1个日志文件其实也挺好。
自己写记录器 实现关键点要注意什么? 1线程一个日志 那不就会生产上百个日志?[/quote] 明显你没有看明白,我们的意思是一个进程里就一个专门写日志的线程,其他的线程要写日志,就发消息给这个写日志的线程。
skgary 2014-08-24
  • 打赏
  • 举报
回复
引用 5 楼 ldh911 的回复:
高并发中,Log4j表现不是很好,以前基本自己写记录器,现在转Logback。 同意4楼观点,1个服务线程1个日志文件其实也挺好。
好吧。我承认,Log4J的性能我的确没有测试过,我都是用自己的日志API+syslog。
MiceRice 2014-08-24
  • 打赏
  • 举报
回复
高并发中,Log4j表现不是很好,以前基本自己写记录器,现在转Logback。 同意4楼观点,1个服务线程1个日志文件其实也挺好。
pcvvv 2014-08-24
  • 打赏
  • 举报
回复
引用 5 楼 ldh911 的回复:
高并发中,Log4j表现不是很好,以前基本自己写记录器,现在转Logback。 同意4楼观点,1个服务线程1个日志文件其实也挺好。
自己写记录器 实现关键点要注意什么? 1线程一个日志 那不就会生产上百个日志?
pcvvv 2014-08-24
  • 打赏
  • 举报
回复
我面试的c++岗位,log4cplus怎么样?
MiceRice 2014-08-23
  • 打赏
  • 举报
回复
1W并发规模,预计会有100~500条服务线程,可以考虑同时切分为100个日志文件,将日志记录长度定长为60字节;5条服务线程共享一个日志文件。 每隔1小时或更长,切换到新的日志目录。 另外有批量日志处理程序负责将日志搬移合并归档或直接写入数据库以便检索利用。
加载更多回复(3)

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧