Linux面试题总结

2021年11月22日 阅读数:5
这篇文章主要向大家介绍Linux面试题总结,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

一、/var/log/messages日志中找到相关信息:kernel: nf_conntrack: table full, dropping packet。出现这些信息会致使什么后果?该如何解决?(此试题为网上他人总结,本身拿来学习)php

解答:这个报错意思是,链接跟踪表已满,开始丢包。node

出现上述结果会致使业务访问很慢。解决方法以下:mysql

方案1:进行相关的系统参数的能够调优。linux

sysctl -a | grep nf_conntrack(在/etc/sysctl.conf文件中 ):nginx

net.netfilter.nf_conntrack_max  =   1048576  
net.netfilter.ip_conntrack_tcp_timeout_established  =   3600  
net.netfilter.nf_conntrack_tcp_timeout_close_wait  =   60  
net.netfilter.nf_conntrack_tcp_timeout_fin_wait  =   120  
net.netfilter.nf_conntrack_tcp_timeout_time_wait  =   12

方案2:使用祼表,添加“不跟踪”标识。以下示例更适合桌面系统或随意性强的服务器。由于它开启了链接的状态机制,方便和外部通讯。修改 /etc/sysconfig/iptables 文件:

*raw 
# 对TCP链接不启用追踪,解决ip_contrack满致使没法链接的问题 
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 22 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 21 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 60000:60100 -j NOTRACK 
-A PREROUTING -p tcp -s 192.168.10.1 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 22 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 21 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 60000:60100 -j NOTRACK 
-A OUTPUT -p tcp -s 192.168.10.1 -j NOTRACK COMMIT 
*filter 
# 容许ping 
-A INPUT -p icmp -j ACCEPT # 对本地回路、第5张网卡放行 
-A INPUT -i lo -j ACCEPT -A INPUT -i eth4 -j ACCEPT # 链接状态跟踪,已创建的链接容许传输数据 
-A INPUT -m state --state ESTABLISHED,RELATED,INVALID,UNTRACKED -j ACCEPT # filter表里存在但在raw里不存在的,默认会进行链接状态跟踪 
-A INPUT -s 192.168.10.31 -p tcp --dport 2669 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT

方案3:若是对安全没有要求,好比在内网。这种状况下,可使用下面的方法进行解决
关闭防火墙,并设置不自动开启
chkconfig iptables off 
chkconfig ip6tables off 
service iptables stop 
service ip6tables stop
切记:在防火墙关闭状态下,不要经过iptables指令(好比 iptables -nL)来查看当前状态!由于这样会致使防火墙被启动,并且规则为空。虽然不会有任何拦截效果,但全部链接状态都会被记录,浪费资源且影响性能并可能致使防火墙主动丢包!

方案4:加大防火墙跟踪表的大小,优化对应的系统参数
  一、状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
    以64G的64位操做系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152
    即时生效请执行:
sysctl –w net.netfilter.nf_conntrack_max = 2097152
  二、其哈希表大小一般为总表的1/8,最大为1/2。CONNTRACK_BUCKETS = CONNTRACK_MAX / 8
    一样64G的64位操做系统,哈希最佳范围是 262144 ~ 1048576 。
    运行状态中经过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,经过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置
    或者新建 /etc/modprobe.d/iptables.conf ,从新加载模块才生效:
options nf_conntrack hashsize = 262144

二、请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)web

ifconfig bond0 | sed -n 2p | cut -d : -f2 |cut -c 1-13
ifconfig bond0 | sed -n 2p | awk -F '[ :]+' '{print $4}'
ifconfig bond0 | awk  -F '[ :]+' 'NR==2 {print $4}'
ifconfig bond0 | grep "inet addr:*" | awk -F '[ :]+' '{print $4}'
ifconfig bond0 | sed -n 2p | sed 's#^.*addr:##g'|sed 's#B.*$##g'

解释:处理须要的目标(获取的字符串如上题的IP地址)前的字符串通常用以..开头(^.*)来匹配开头,匹配的结尾协商实际的字符,如:"^.*addr:"表达式匹配,结尾同开头匹配方式一致redis

取出Bcast  sql

ifconfig bond0 |sed -n 2p | sed 's#^.*75[[:space:]]##g' | sed 's#:.*$##g' 
ifconfig bond0 |sed -n 2p | sed 's#^.*75  ##g' | sed 's#:.*$##g'

用分组的方法来匹配shell

sed 's#(ddd)(fff)\1\2##g'
ifconfig bond0 | sed -n 's#^.*addr:\(.*\)  B.*$#\1#gp'



三、查找当前目录下全部文件,并把文件中的www.a.org字符串替换成www.b.cc数据库

find . -type f -name "*.txt" | xargs sed -i 's#www.a.org#www.b.cc#g'
find . -type f -name "*.txt" -exec sed -i 's#www.a.org#www.b.cc#g' {} \;


四、请给出以下格式的date命令 例:11-02-26

date +%F
date +%y-%m-%d
显示时分秒
date +%Y-%m-%d\ %T
date +%F\ %T
cp space.sh space.sh$(date +%F)   以时间结尾来备份  或者cp space.sh space.sh`date +%F`  (反引号)
结果为:space.sh2017-05-04
打印三天前的日期:date +%F --date "-3 day"
打印三天后的日期:date +%F -d "3 day"   date +%F -d "+3 day"


五、

编写个 shell 脚本将/root/script 目录下大于 20K 的文件转移到/root/file 目录下

法1:
#!/bin/bash
for file in `ls -l /root/script`
do
if [ -f $file ]; then
if [ `ls -l $file|awk '{print $5}'` -gt 10000 ]; then
mv $file /root/file
fi
fi
done
法2:
#/bin/bash
#=========bk file great 20K to other dirctory
cd /root/script
file=`ls -lk`
dir=/root/file
if
  [ -d $dir ] 
    then
       echo "directory is exsit"  
       find . -size +10k | xargs -I '{}' mv {} $dir
    else 
       mkdir -p /root/file
       find . -size +10k | xargs -I '{}' mv {} $dir
fi

七、如何设置tomcat-8.5.9 JVM内存大小,写出设置步骤
在tomcat的bin目录下的catalina.sh中增长以下代码:

JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"

八、nginx代理后端主机,客户端访问时页面与日志都是出现504 gateway timeout提示信息,如何解决?写出步骤
解答:

能是Nginx的相关错误,也多是后端服务器的问题。那么咱们从这些方面入手了解一下问题的所在。

(1)首先须要肯定的是后端服务器启动没有,固然在这里是php-fpm进行启动没有。

(2)其次是肯定php-fpm的worker进程是否够用。如不够用,修改nginx.conf中的worker_processes

(3)FastCGI缓存或代理的缓存状况。

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;

(4)PHP执行时间长

九、如何检查两端文件是否同步完成,并经过配置zabbix来展现和监控,写出思路与具体配置步骤

解答:

a、把服务器A上要同步到服务器B上的文件写入到file.txt中,经过shell脚本对服务器A上的文件作一个MD5的验证,使用以下脚本

#!/bin/bash
file='/tmp/file.txt'
while read line
do
        md5sum $line >> /tmp/md5.txt
    done < $file
if [ $? -eq 0 ]
then
        scp /tmp/md5.txt 
root@10.168.210.70:/tmp/  && rm -rf /tmp/file.txt /tmp/md5.txt || echo "scp failed"
else
        echo "md5sum failed"
fi

针对每行文件写md5值,并记录到md5.txt中。并拷贝到另一台服务器。

在服务器B上执行:
/usr/bin/md5sum -c --status /root/md5.txt && echo 0 || echo 1
0

0表示成功,1表示失败

b、加入zabbix监控中

UserParameter=check_conf_md5,/usr/bin/md5sum -c --status /tmp/md5.txt && echo 0 || echo 1


c、最后重启zabbix服务

/etc/init.d/zabbix_agentd restart

web端添加item

注意:还要在服务器A设置计划任务,按期执行脚本并拷贝到服务器A,服务器A触发zabbix_agentd监测是否一致。


十、使用free -mh发现cached大小为4G,内存可以使用量只有5M,请问如何清除,写出步骤并注释

仅清除页面缓存(PageCache)
# sync; echo 1 > /proc/sys/vm/drop_caches
清除目录项和inode
# sync; echo 2 > /proc/sys/vm/drop_caches
清除页面缓存,目录项和inode
# sync; echo 3 > /proc/sys/vm/drop_cache


十一、建立与调整SWAP分区的方法,请写出具体步骤

用文件做为Swap分区

a.建立要做为swap分区的文件:增长1GB大小的交换分区,则命令写法以下,其中的count等于想要的块的数量(bs*count=文件大小)。
# dd if=/dev/zero of=/root/swapfile bs=1M count=1024
b.格式化为交换分区文件:
# mkswap /root/swapfile #创建swap的文件系统
c.启用交换分区文件:
# swapon /root/swapfile #启用swap文件
d.使系统开机时自启用,在文件/etc/fstab中添加一行:
/root/swapfile swap swap defaults 0 0

新建和增长交换分区用到的命令为:mkswap、swapon等,而想关闭掉某个交换分区则用“swapon /dev/sdb2”这样的命令便可。

十二、如何设置redis开启远程访问

在redis的配置文件redis.conf中,找到bind localhost注释掉。
    注释掉本机,局域网内的全部计算机都能访问。
    band localhost   只能本机访问,局域网内计算机不能访问。
    bind  局域网IP    只能局域网内IP的机器访问, 本地localhost都没法访问

1三、登录mysql数据库进行操做,出现Too Many Connections的错误提示,如何解决?写出配置步骤

链接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout  都有关系。wait_timeout 的值越大,链接的空闲等待就越长,这样就会形成当前链接数越大。

修改MySQL配置文件/etc/my.cnf,设置成max_connections=1000,wait_timeout=5。

若是没有此项设置能够自行添加,修改后重启MySQL服务便可。要不常常性报此错误,则要对服务器做总体性能优化

补充:

在工做中,你们或许经常遇到Too many connections这个错误,这时想进数据库管理都进不去,是很是尴尬的一件事情。固然有人说能够修改配置文件,可是修改配置文件是须要重启mysqld的,这在业务繁忙的数据库服务器上是不容许的。因此紧急状况下能够采用以下的方法:

[root@mysql-server-01 ~]# gdb -p $(cat /application/mysql/data/mysql_sandbox5619.pid) -ex "set max_connections=500" -batch  
[New LWP 27541]
[New LWP 27540]
[New LWP 27539]
[Thread debugging using libthread_db enabled]
0x00000031152df343 in poll () from /lib64/libc.so.6
[root@mysql-server-01 ~]#


下面再次登陆数据库看看,并查看最大链接数是否已经修改


[root@mysql-server-01 mysql]# ./use 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.6.19-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql [localhost] {msandbox} ((none)) > show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+
1 row in set (0.00 sec)
mysql [localhost] {msandbox} ((none)) >


在Percona5.5的thread_pool里面提供了2个参数extra_port和extra_max_connections预留额外的链接,预防链接满了之后咱们没法进入数据库进行相应的管理。


root@localhost : (none) 23:18:00> show variables like '%extra%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| extra_max_connections | 1     |
| extra_port            | 10086 |
+-----------------------+-------+
2 rows in set (0.00 sec)
root@localhost : (none) 23:18:04>
[root@mysql-server-01 user_3307]# netstat -nltp | grep 10086
tcp        0      0 0.0.0.0:10086               0.0.0.0:*                   LISTEN      29655/mysqld        
[root@mysql-server-01 user_3307]#

我这里使用了10086端口,以及最大链接数为1。有这么贴心的功能。必须给一个赞


总结:


一般控制最大链接数有两个参数控制max_connections(该实例容许最大的链接数 ),max_user_connections(该实例容许每一个用户的最大链接数),一般状况下前期咱们就须要规划好多少链接数合适。通常状况下建议不要超过300。由于MySQL在链接数上升的状况下性能降低很是厉害,若是须要大量链接,这时能够引入thread_pool。因此咱们须要保持一个原则:系统建立的用户(给应用使用用户)数* max_user_connections  < max_connections。这样就不会发生文章开始说的问题。



上一篇: iOS面试题总结
下一篇: 算法面试题总结