腾讯运维开发笔试题(记不全了 挺多的 不定项选择 填空 和 手写代码):
自己挂了,太菜了。神往之。 希望大家能过,主考官技术向max 膝盖给到。
1.用python写一个斐波那契数列
def recur_fibo(n):
"""递归函数
输出斐波那契数列"""
if n <= 1:
return n
else:
return(recur_fibo(n-1) + recur_fibo(n-2))
# 获取用户输入
nterms = int(input("您要输出几项? "))
# 检查输入的数字是否正确
if nterms <= 0:
print("输入正数")
else:
print("斐波那契数列:")
for i in range(nterms):
print(recur_fibo(i))
2.使用python连接mysql 并写一个sql查询
#查询操作
import pymysql #导入 pymysql
#打开数据库连接
db= pymysql.connect(host="localhost",user="root",
password="123456",db="test",port=3307)
# 使用cursor()方法获取操作游标
cur = db.cursor()
#1.查询操作
# 编写sql 查询语句 user 对应我的表名
sql = "select * from user"
try:
cur.execute(sql) #执行sql语句
results = cur.fetchall() #获取查询的所有记录
print("id","name","password")
#遍历结果
for row in results :
id = row[0]
name = row[1]
password = row[2]
print(id,name,password)
except Exception as e:
raise e
finally:
db.close() #关闭连接
3.股票在什么时候卖出最赚
给定一个数组,该数组中第i个元素是某个股票第i天的价钱
如果最多只能完成一次交易(买入股票,卖出股票),设计一个算法,可以获得最大的利润
注意:在你买入股票之前不能卖出股票
解答来自https://blog.csdn.net/qiubingcsdn/article/details/82467276
申明三个变量,头指针pre、尾指针tail和最大利润maxProfit,头指针指向当前访问到的数组的最小值,尾指针指向当前访问到的最大值
访问数组prices,如果出现i-pre<tail-pre就替换pre和tail为i(i元素值必定小于头指针pre值)
继续访问数组,如果出现i-pre>tail-pre就替换tail为i(i元素值必定大于尾指针tail值),并且替换maxProfit的值为max(maxProfit,i-pre)
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices)<=1:
return 0
pre = prices[0]
tail = prices[0]
maxProfit = 0
for i in range(1,len(prices)): #从第二个元素开始访问数组
if prices[i]-pre<0: #替换头指针和尾指针为当前访问到的数组的最小值
pre = prices[i]
tail = prices[i]
if prices[i]-pre>tail-pre: #替换尾指针为当前访问(从最小数值开始)的最大值
maxProfit = max(prices[i]-pre, maxProfit) #对比此时利润和之前保存的最大利润,返回现阶段可获得的最大利润
tail = prices[i]
return maxProfit
4.读取ini文件(是一个组合题具体忘了)
抄自https://blog.csdn.net/weixin_41407477/article/details/86013515
首先,创建一个config.ini文件:
[debug]
log_errors=true
show_warnings=False
[server]
port: 8080
nworkers: 32
pid-file=/tmp/spam.pid
root=/www/root
然后,在test模块去读取配置:
from configparser import ConfigParser
cfg = ConfigParser()
cfg.read('config.ini')
print(cfg.sections())
print(cfg.get('debug', 'log_errors'))
print(cfg.getint('server', 'port'))
#result:
['debug', 'server']
true
8080
FAQ:如果ini文件中有特殊符号%的时候使用ConfigParser这个办法就会报错
configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: '%v='
这时候就需要修改一下方法:
# cf = configparser.ConfigParser()
修改成
cf = configparser.RawConfigParser()
Python的ConfigParser Module中定义了3个类对INI文件进行操作。
分别是RawConfigParser、ConfigParser、SafeConfigParser。
RawCnfigParser是最基础的INI文件读取类,ConfigParser、SafeConfigParser支持对%(value)s变量的解析。
其他面试笔试 主要是 腾讯云 米哈游 网易 叠纸游戏 运维岗位
1. 创建6个用户 密码随机(密码为8位字符)
第一步 创建用户并设置密码
for n in seq 11 16;do useradd user$n;echo "user$n:user$necho user$n|md5sum|cut -c4-8"|chpasswd;done
[root@WEB-75 ~]# tail -6 /etc/passwd
user11:x:517:517::/home/user11:/bin/bash
user12:x:518:518::/home/user12:/bin/bash
user13:x:519:519::/home/user13:/bin/bash
user14:x:520:520::/home/user14:/bin/bash
user15:x:521:521::/home/user15:/bin/bash
user16:x:522:522::/home/user16:/bin/bash
2)导出用户密码到文件
[root@WEB-75 ~]# for n in seq 11 16;do echo "user$n:user$necho user$n|md5sum|cut -c4-8";done>>/tmp/newpasswd1
[root@WEB-75 ~]# cat /tmp/newpasswd1
user11:user11b755c
user12:user121deb5
user13:user13f627d
user14:user1472383
user15:user15c5412
user16:user16eb606
2.tcp time_wait状态
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。
客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。
**TIME_WAIT状态存在的理由:**
1)**`可靠地实现TCP全双工连接的终止`**
保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
2)**`允许老的报文在网络中消逝`**
防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
# 2、大量TIME_WAIT造成的影响
在`高并发短连接的TCP服务器`上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下`会出现大量socket处于TIME_WAIT状态`。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
为什么我们要关注这个高并发短连接呢?有两个方面需要注意:
1. `高并发`可以让服务器`在短时间范围内同时占用大量端口`,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
2. 在这个场景中,短连接表示“`业务处理+传输数据的时间` 远远小于 `TIMEWAIT超时的时间`”的连接。
`TCP处于TIMEWAIT状态时,别的请求过来后,没有空闲的端口可供tcp连接,大大影响服务器响应请求。` 长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,`一般长连接对应的业务的并发量并不会很高`。
解决方法(个人经验)
编辑 /etc/sysctl.conf文件
net.ipv4.tcp_tw_reuse = 1(网上说在nat网络下有坑 ,但是我再实际操作中大并发应用没有用户遇到)
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps =1
sysctl -p
`net.ipv4.tcp_tw_reuse = 1` 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
`net.ipv4.tcp_tw_recycle = 1` 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
tcp_tw_recycle设置为1,则60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。也就是说服务器打开了 tcp_tw_reccycle了,就会检查时间戳,如果对方发来的包的时间戳是乱跳的或者说时间戳是滞后的,这样服务器肯定不会回复,所以服务器就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求”,于是丢掉不回包,就出现了开始说的syn不响应。
`net.ipv4.tcp_fin_timeout = 15`;这个参数是用来设置保持在FIN_WAIT_2状态的时间。tcp4此挥手,正常的处理流程就是在FIN_WAIT_2情况下接收到FIN进入到TIME_WAIT的情况,tcp_fin_timeout参数对处于TIME_WAIT状态的时间没有任何影响。但是如果这个参数设的比较小,会缩短从FIN_WAIT_2到TIME_WAIT的时间,从而使连接更早地进入TIME_WAIT状态。状态开始的早,等待相同的时间,结束的也早,客观上也加速了TIME_WAIT状态套接字的清理速度
3.查看服务器上tcp各种状态的链接数量
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}'
4. ulimit 参数
参考链接https://blog.csdn.net/huangyimo/article/details/79156286
ulimit -a 查看限制等 文件句柄数
关于文件句柄数:列如设置的fd限制为65533 那么每个进程就能使用65533 fd。
什么情况下会使用fd
一个句柄就是你给一个文件,设备,[套接字])(socket)或管道的一个名字, 以便帮助你记住你正处理的名字, 并隐藏某些缓存等的复杂
c++崩溃之后的coredump的生成路径 大小 通过该命令设置 其实拿到的是系统内存堆栈数据
5.内存状态有哪几种
free -m :查看内存情况,单位为MB。
total 内存总数
used 已经使用的内存数(我的程序使用内存数量+系统缓存使用的内数量)
free 空闲的物理内存数(是真正的空闲,未被任何程序占用)
shared 多个进程共享的内存总额
buffers 磁盘缓存(Buffer Cache)的大小(可提高系统I/O调用的性能)
cached 磁盘缓存(Page Cache)的大小(可提高系统I/O调用的性能)
-buffers/cache 表示已被我们的程序使用的内存数,计算方法:used - buffers - cached
+buffers/cache 表示还可已被我使用的内存数,计算方法:free + buffers + cached
操作系统目前可用内存总量=free + buffers + cached
buffers是用来给块设备做的缓冲大小、buffers是用来存储目录里面有什么内容,权限等等
cached用来给文件做缓冲,用来记忆我们打开的文件.
即使你的程序运行结束后,Cache Memory也不会自动释放。
这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存(free)会很少。
其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。
如果你希望手动去释放Cache Memory也是有办法的。
下面的我慢慢补充
6. 进程之间如何通信
7. 进程和线程的区别
8. 红黑树
9. 时间复杂度 拿冒泡举例
10.一些简单的Linux命令(scp rsync tar 定时任务 上传文件到ftp)
11. 用过哪些python模块 挑自己知道的说
12.用python求2个列表的交集
13.查找/oldboy下所有7天以前以log结尾的文件移动/tmp下
find /data/oldboy -type f -name "*.log" -mtime +7 -exec mv {} /tmp \;
14.lvs nginx haproxy优缺点以及区别
写在最后:已入职