一、工作中,从安全的角度上出发,时常不给使用超级管理员root用户,但是普通用户的权限又不能满足实际工作中使用,所以就有一种需求,使得一个用户的权限比普通用户高,而又不能比root用户权限高,可以创建一个普通用户赋予root组的权限,请写出创建的命令:创建一个user1用户,使他拥有root组的权限
答案:
useradd user1 && usermod -G root user1
复制代码
二、如何合理的设置线程池中线程数的大小
线程池究竟设成多大是要看你给线程池处理什么样的任务,任务类型不同,线程池大小的设置方式也是不同的。任务一般可分为:CPU密集型、IO密集型,对于不同类型的任务需要分配不同大小的线程池。
答案:
CPU密集型任务
- 尽量使用较小的线程池,一般为CPU核心数+1。
- 因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,只能增加上下文切换的次数,因此会带来额外的开销。
IO密集型任务
- 可以使用稍大的线程池,一般为2*CPU核心数。
- IO密集型任务CPU使用率并不高,因此可以让CPU在等待IO的时候去处理别的任务,充分利用CPU时间。
一般经过监控程序,逐步调整线程池线程数,使其达到合理的数量
三、背景:公司由于考虑到安全问题想对nginx进行升级,但是之前安装nginx 的文档找不到了,不知道编译过什么模块,想让你查一查编译过什么模块,请写出查询过程
答案:
/usr/local/nginx/sbin/nginx -V
复制代码
备注:/usr/local/nginx 是nginx 的安装路径
四、什么是OpenResty, 为什么要用OpenResty?
答案:
-
Nginx是C语言开发,如果要二次扩展是很麻烦的,而基于OpenResty,开发人员可以使用 Lua 编程语言对 Nginx 核心模块进行二次开发拓展
-
OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起,性能强大,OpenResty可以快速构造出1万以上并发连接响应的超高性能Web应用系统
-
基于Ngnix和Lua的高性能web平台,内部集成精良的LUa库、第三方模块、依赖, 开发者可以方便搭建能够处理高并发、扩展性极高的动态web应用、web服务、动态网关。
五、什么是缓存雪崩、缓存穿透,怎么解决?
答案:
- 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都 去查询数据库了,⽽对数据库 CPU 和内存造成巨⼤压⼒,严重的会造成数据库宕机。从⽽形成⼀系列 连锁反应,造成整个系统崩溃。⼀般有三种处理办法:
- ⼀般并发量不是特别多的时候,使⽤最多的解决⽅案是加锁排队。
- 给每⼀个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
- 为 key 设置不同的缓存失效时间。
- 缓存穿透是什么?
缓存穿透是指⽤户查询数据,在数据库没有,⾃然在缓存中也不会有。这样就导致⽤户查询的时候,在 缓存中找不到,每次都要去数据库再查询⼀遍,然后返回空(相当于进⾏了两次⽆⽤的查询)。这样请 求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
- 怎么解决缓存穿透?
有很多种⽅法可以有效地解决缓存穿透问题,最常⻅的则是采⽤布隆过滤器,将所有可能存在的数据哈 希到⼀个⾜够⼤的 bitmap 中,⼀个⼀定不存在的数据会被这个 bitmap 拦截掉,从⽽避免了对底层存 储系统的查询压⼒。另外也有⼀个更为简单粗暴的⽅法,如果⼀个查询返回的数据为空(不管是数据不 存在,还是系统故障),我们仍然把这个空结果进⾏缓存,但它的过期时间会很短,最⻓不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第⼆次到缓冲中获取就有值了,⽽不会继续访问数据库。
拓展
- 缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在⽤户请求的时候, 先查询数据库,然后再将数据缓存的问题!⽤户直接查询事先被预热的缓存数据!
- 缓存更新
缓存更新除了缓存服务器⾃带的缓存失效策略之外(Redis 默认的有 6 中策略可供选择),我们还可以根据具体的业务需求进⾏⾃定义的缓存淘汰,常⻅的策略有两种: (1)定时去清理过期的缓存;(2)当有⽤户请求过来时,再判断这个请求所⽤到的缓存是否过期,过期的话就去底层系统得到新数 据并更新缓存。
- 缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或⾮核⼼服务影响到核⼼流程的性能时,仍然 需要保证服务还是可⽤的,即使是有损服务。系统可以根据⼀些关键数据进⾏⾃动降级,也可以配置开 关实现⼈⼯降级。降级的最终⽬的是保证核⼼服务可⽤,即使是有损的。⽽且有些服务是⽆法降级的 (如加⼊购物⻋、结算)。