-
为什么使用定时器?
- 该项目中的定时器是为了关闭在客户端和服务器之间建立的、长时间没有请求的连接,由于每个连接都需要消耗一些服务器的资源,如端口号,关闭连接可以帮助释放资源,让服务器更好的处理新请求,提高服务器的响应速度、资源利用率
-
定时器模块的工作的原理?
-
项目使用一个带头尾节点的双链表保存定时器,并按照超时时间升序排列,定时器结构体存储了定时器的到期时间
-
服务器启动时,创建监听套接字,绑定到指定端口,并开始监听;接收新的客户端连接,将其加入到epoll实例中,并为每个新连接创建一个定时器、设置到期时间
-
使用alarm设置定时器,每隔一段时间发送SIGALRM信号,并通过管道通知主循环处理
-
主循环使用epoll_wait等待I/O事件或定时器事件,当SIGALRM信号触发时,主循环调用timer_handler关闭非活跃的客户端连接(将定时器从链表中移除)
-
-
讲一下你的日志模块的运行流程
-
为方便管理,日志是用单例模式实现的,首先调用方法获取日志的单例实例,并对日志初始化(指定日志级别、最大队列大小、同步or异步等)
-
需要记录日志时,日志类中的写方法会先检查日志行数有没有达到最大值,随后将日志信息添加到队列中,再由后台线程取出日志信息写入文件(后台线程处理,保证了不会阻塞主线程的运行)
-
-
为什么使用了异步日志,讲一讲这个异步日志是怎么实现的
-
同步日志指的是写入日志与工作线程串行,异步日志将日志写入函数交给其他线程,更加高效
-
本项目的日志使用了生产者-消费者模型,将日志内容先存入阻塞队列,写线程再从队列中取出内容,将日志写入磁盘中
-
-
你的服务器支持多少的并发量,你是如何做压力测试的?
- 水平触发,1W的并发量,ET模式应当会更高
-
你这个webbench是什么,介绍一下原理?
-
是Linux上一款知名的web压力测试工具,展示每秒钟响应请求数和传输数据量
-
首先fork出多个子进程,每个子进程循环做web访问测试,子进程把访问结果通过管道告诉父进程,父进程统计最终结果
-
-
cpu忽然百分之百了该如何排查?
-
Windows下查看任务管理器,Linux下使用ps命令查看CPU使用率最高的进程,然后分析进程信息,系统进程考虑是否由于系统更新导致
-
查看日志文件,看是否有错误或警报信息,Linux下/var/log/syslog文件
-
用netstat检查网络连接情况,网络连接异常也可能导致CPU使用率过高
-
-
你的项目里用了哪些设计模式?怎么实现的?
-
在线程池和定时器使用了单例模式,确保一个类只有一个实例
-
先私有化其构造函数(该类不能被外界实例化,构造方法只能为private),自行实例化(实例是当前类的静态成员变量),并用一个公有的静态方法获取该实例
-
分为饿汉式(在类加载的时候就立刻实例化)和懒汉式(在第一次使用的时候再进行实例化)
-
-
单例模式优缺点?
-
优点:由于只创建一个实例,可以减少内存消耗;保证了唯一性(很多情况下保证一个类只有一个实例很重要,如打印机);提供了唯一的访问点,可以在应用程序的任何地方访问到相同的实例
-
缺点:访问点唯一,代码耦合性增加,单元测试困难;实例数量受限,代码重构困难
-
web server日志、定时器等相关面试题
最新推荐文章于 2024-07-28 22:05:31 发布