面试题30天打卡-day30

简介: 面试题30天打卡-day30

1、如何在 Linux 中查看系统资源使用情况?比如内存、CPU、网络端口。


以下是Linux中一些常用的命令来查看系统资源使用情况:


top:实时动态地显示系统的 CPU 使用情况、进程信息、内存占用情况等。可以使用 q 键退出。top命令可以实时显示各个进程的 CPU 占用率、内存占用率等信息。

htop:类似于 top,但是在交互性和功能上更加强大。可以使用 q 键退出。

free:查看系统内存的使用情况,包括总共的内存量、已使用的内存量、空闲的内存量等。可以使用 -h 参数让输出结果以易读的方式显示。

内存使用情况: free -h,其中 -h 参数可以让输出结果以易读的方式显示,该命令可以显示系统总共的内存量、已使用的内存量、空闲的内存量等信息。

vmstat:以文本形式显示系统的 CPU 使用情况、内存使用情况、虚拟内存使用情况等。可以使用 -s 参数来查看更详细的信息。

sar:收集系统历史性能数据,并以报告形式输出。可以通过安装 sysstat 包来使用该命令。

iostat:显示磁盘 I/O 活动情况,包括读写速度、等待时间等信息。可以使用 -x 参数来显示更详细的信息。

iostat -c 1 1 命令可以显示 CPU 的负载情况。

mpstat:显示每个 CPU 核心的使用情况,包括用户模式下和内核模式下的占用情况、CPU 间的切换次数等信息。

nmon:显示 Linux 系统的各种性能指标,包括 CPU 使用率、内存使用率、磁盘 I/O 使用率、网络吞吐量等。可以使用交互式界面查看。

netstat:可以查看正在使用的网络连接、监听的端口等信息。如果只想查看特定端口的连接情况,可以使用 netstat -an | grep PORT 命令来进行过滤。

该命令可以显示当前正在使用的网络连接、监听的端口等信息。如果只想查看特定端口的连接情况,可以使用 netstat -an | grep PORT 命令来进行过滤,其中 PORT 指代特定的端口号。

2、如何用 Nginx 做限流,有几种限流算法,分别如何实现?

回答一:

Nginx 可以通过配置限制每个客户端请求的速率来实现限流。具体来说,Nginx 有两种限流方式:基于请求速率限制基于连接速率限制


下面分别介绍这两种方式以及常用的限流算法。


基于请求速率限制:基于请求速率限制是指限制每个客户端的请求速率,常用的限流算法有以下几种:

漏桶算法:在单位时间内处理一定数量的请求,多余的请求则会放入一个“漏桶”中,随后以固定速率处理。

令牌桶算法:在每个单位时间内,将一定数量的“令牌”放入桶中,每次请求需要获取一个令牌才能被处理,当桶中没有令牌时,请求将被拒绝。

计数器算法:简单地对请求计数,并限制每个客户端在单位时间内最多可以处理的请求数量。

在 Nginx 中实现基于请求速率的限流通常需要使用模块,如 ngx_http_limit_req_module、ngx_http_limit_conn_module 等。


基于连接速率限制:基于连接速率限制是指限制每个客户端的连接速率,常用的限流算法有以下几种:

并发连接数:限制每个客户端同时能够建立的连接数,以此来限制连接速率。

队列长度:将每个连接加入到一个队列中,限制队列中同时存在的连接数量,以此来限制连接速率。

在 Nginx 中实现基于连接速率的限流通常需要使用模块,如 ngx_http_limit_conn_module 等。


要实现基于请求速率或连接速率的限流,我们需要在 Nginx 配置文件中设置相应的限流规则。以下是一个基于漏桶算法的 Nginx  配置示例:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    server {
        location / {
            limit_req zone=one burst=20;
            proxy_pass http://backend;
        }
    }
}


其中,limit_req_zone 指定了一个名为 one 的共享内存区域,用于存储请求的统计信息,同时指定了速率为 10r/s。在 location 中,limit_req 指定了限流规则,并将请求转发到后端服务器。


需要注意的是,不同的限流算法适用于不同的场景,我们需要根据实际情况选择合适的算法和配置参数。同时,在实际应用中,为了防止恶意攻击和 DDOS 攻击,通常需要将多种限流算法组合起来使用。


回答二:


Nginx 提供了几种限流算法,包括漏桶算法、令牌桶算法、基于计数器和滑动窗口的限流等。这里简单介绍一下这几种算法以及如何在 Nginx 中实现:


漏桶算法

漏桶算法是一种比较简单的限流算法,它的原理是将请求放入一个固定容量的桶中,在一段时间内以一个固定的速率将请求处理出桶,超出桶容量的请求则被丢弃或延迟响应。这种算法可以稳定地控制请求处理的速率。


在 Nginx 中,可以使用 ngx_http_limit_req_module 模块来实现漏桶算法的限流。可以通过配置文件设置桶的容量和速率限制,比如:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
    server {
        location /api {
            limit_req zone=mylimit burst=20 nodelay;
            ...
        }
    }
}


上面的配置意味着对于每个 IP 地址,最多处理 10 个请求/秒,并且可以瞬间处理 20 个请求(即 burst 值),如果超过则会被丢弃或延迟响应(如果使用 nodelay 参数则会丢弃,否则会延迟响应)。


令牌桶算法

令牌桶算法是一种比较高效的限流算法,它的原理是维护一个令牌桶,每到达一个请求就从桶中取走一个令牌,如果桶中的令牌数量不足,则拒绝请求。这种算法可以根据业务需求调整令牌的发放速率,从而实现更加灵活的限流。


使用限速模块 ngx_http_limit_req_module 实现 Nginx 请求限制。


该模块允许您设置限制以控制客户端可以向服务器发送请求的速率。


这里是一个简单的例子:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        location / {
            limit_req zone=one burst=5;
            proxy_pass http://backend;
        }
    }
}


上面的配置限制了来自同一 IP 的请求速率为每秒 1 个(rate=1r/s)。在每秒内请求速率超过 1 个的情况下,将会触发 ngx_http_limit_req_module 模块的拒绝服务逻辑。burst=5 表示在 5 个请求内允许出现短时间的突发流量。


在 Nginx 中,可以使用 ngx_http_limit_conn_module 模块或者第三方模块 ngx_http_limit_traffic_module 来实现令牌桶算法的限流。其中 ngx_http_limit_conn_module 模块支持限流的粒度为 IP 地址,而 ngx_http_limit_traffic_module 支持限流的粒度可以是一个自定义的 key。


基于计数器和滑动窗口的限流

此类算法相对于前两种算法,在实现上稍微复杂一些,但是在应对突发流量时效果更好。基本思路是使用计数器来记录某个时间段内的请求数量,并使用滑动窗口算法来平滑处理计数器的波动。


我们需要限制单个IP每分钟访问不超过100次,并且防止恶意攻击。可以使用Nginx的limit_req模块实现基于计数器和滑动窗口的限流。

具体代码如下:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=100r/m;
    server{
        location /{
            limit_req zone=mylimit burst=10 nodelay;
            //其他处理代码
        }
    }
}

其中,limit_req_zone命令定义了一个名为mylimit、大小为10M的共享内存区,用来存储访问信息。rate=100r/m表示限制速率为100次/分钟。在nginx配置文件的server块中,使用limit_req命令实现对每个请求的限流,burst=10表示允许短时间内处理10次请求,而nodelay则指定处理延迟最小化。


在 Nginx 中,可以使用第三方模块 ngx_http_slab_stat_module 或者 ngx_http_limit_requests_module 来实现基于计数器和滑动窗口的限流。其中 ngx_http_slab_stat_module 模块通过记录访问日志并使用 LRU 缓存来计算请求数量和请求时间窗口;而 ngx_http_limit_requests_module 则是使用 shdict 缓存和滑动窗口算法来实现的。


以上是 Nginx 中常见的限流算法和实现方式,选择何种算法取决于具体的业务需求和系统目标。

3、git pull 和 git fetch 命令分别有什么作用?二者有什么区别?


git pull和git fetch都是用于拉取远程代码的命令,但它们在执行过程中有一些区别。


git fetch:

使用 git fetch 可以从远程仓库获取最新代码。执行 git fetch 后,并不会对当前本地代码进行任何改动,也不会自动合并代码。它会将远程仓库的代码更新到本地的一个单独的分支上(例如,origin/master分支),并且该分支的指针会向前移动到最新的提交记录。这个过程只会更新本地代码库的信息,但是不会合并到你的工作区。如果要将远程分支合并到本地分支,则需要使用 git merge 命令进行合并操作。

示例:

git fetch origin master    // 从远程的origin仓库的master分支获取最新版本到本地的origin/master分支
git merge origin/master   // 将本地的origin/master分支合并到当前所在的分支

git pull:

git pull 是将远程仓库的最新代码更新到本地,并与本地仓库合并的操作。


它的执行过程大致可以分为以下步骤:


获取远程仓库的更新信息

使用 git fetch 命令获取远程仓库的最新(或指定)分支的相关更新信息,包括分支名称、最新的提交记录等,在本地创建一个对应于远程分支的本地分支(默认情况下名称为origin/remote_branch_name)。


合并远程分支到本地分支

使用 git merge 命令将本地分支与远程分支进行合并,这个过程会将本地分支里的代码与远程分支里的代码进行比较,然后执行一个三方合并操作,将两者的差异代码融合在一起。


解决合并冲突

如果本地分支和远程分支之间存在代码冲突,那么在执行合并操作时就会出现合并冲突。此时需要手动解决冲突,然后重新添加、提交、推送本地分支。


更新工作区

最后,将合并后的代码更新到工作区,使得工作区的代码也同步到最新的状态。


因此,git pull 可以看做是 git fetch 和 git merge 命令的组合,先获取远程仓库的更新信息,再将其与本地分支进行合并,并将合并后的代码更新到工作区。在合并过程中,如果出现代码冲突,则需要手动解决冲突,然后重新提交本地分支。

示例:

git pull origin master   //将远程的origin仓库的master分支获取最新版本并merge到当前分支

git fetch和git pull 的区别:


git fetch 只是将远程仓库的代码下载到本地,可以选择合并或不合并到本地分支

git pull 则是将远程仓库的最新代码下载到本地,并直接合并到当前分支中,它相当于是先执行 git fetch,再执行 git merge 的操作。



目录
相关文章
|
安全 Java 关系型数据库
面试题30天打卡-day10
面试题30天打卡-day10
53 0
|
JavaScript 前端开发 Java
面试题30天打卡-day05
面试题30天打卡-day05
43 0
|
6月前
|
存储 程序员 编译器
C++面试题其二
extern "C" 用于告诉编译器按照C语言的链接方式处理代码,通常用于C++代码与C代码混合编程,以防止因名字修饰(name mangling)引起的链接错误。例如: extern "C" { void c_function(); } 通过这些问题的深入理解和解答,能够更好地掌握C++编程的核心概念和实际应用,为面试做好充分的准备。
81 1
|
负载均衡 NoSQL 安全
面试题30天打卡-day14
面试题30天打卡-day14
39 0
|
前端开发 Java 数据库
面试题30天打卡-day01
面试题30天打卡-day01
54 0
|
缓存 监控 安全
Java多线程并发面试题 1
Java多线程并发面试题
55 0
|
存储 算法 安全
【C++】面试题
【C++】面试题
144 0
|
JavaScript 前端开发 算法
|
安全
常见面试题
什么是单例模式?有几种?(必会)
81 0
|
存储 XML SQL
面试题
面试题
61 0