当前位置: 首页 > 编程日记 > 正文

大量LAST_ACK 的分析过程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

记录一下自己的思想过程
现象:在netstat的时候发现大量处于LAST_ACK状态的TCP连接,达到在ESTABLISHED状态的90%以上

[root@ccsafe ~]# netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c               
      6 CLOSE_WAIT
      7 CLOSING    
   6838 ESTABLISHED
   1037 FIN_WAIT1  
    357 FIN_WAIT2  
   5830 LAST_ACK   
      2 LISTEN     
    276 SYN_RECV   
     71 TIME_WAIT  
[root@ccsafe ~]#

看看系统状态,性能都花在系统中断和上下文切换
[root@ccsafe ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b   swpd   free   buff cache   si   so    bi    bo   in   cs us sy id wa st
1 0      0 3091812 363032 284132    0    0     0     0    1    1 0 0 100 0 0
0 0      0 3091812 363032 284132    0    0     0     0 13750 3174 0 5 94 0 0
0 0      0 3091936 363032 284132    0    0     0     0 13666 3057 1 5 94 0 0
0 0      0 3092060 363032 284132    0    0     0    16 13749 3030 0 5 95 0 0
0 0      0 3092060 363032 284132    0    0     0     0 13822 3144 0 5 95 0 0
0 0      0 3092060 363032 284132    0    0     0     0 13390 2961 0 5 95 0 0
0 0      0 3092060 363032 284132    0    0     0     0 13541 3182 0 6 94 0 0


查看socket队列信息
[root@ccsafe ~]# sar -n SOCK 5
Linux 2.6.18-53.1.13.el5PAE (ccsafe)     10/21/2008

06:31:43 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
06:31:48 PM      6951     13868         1         0         0       430
Average:         6951     13868         1         0         0       430

根据TCP状态的变化过程来分析,LAST_ACK属于被动关闭连接过程中的状态
ESTABLISHED->CLOSE_WAIT->(发送ACK)->LAST_ACK->(发送FIN+接收ACK)->CLOSED
现在状态都堆积到LAST_ACK,初步判断问题从上下两个状态着手

调节一下LAST_ACK时间...
[root@ccsafe ~]# sysctl -a |grep last_ack
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30

[root@ccsafe ~]# sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack=10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 10
[root@ccsafe ~]# sysctl -p

[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"
Every 5.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

6 CLOSE_WAIT
      9 CLOSING
   6420 ESTABLISHED
    693 FIN_WAIT1
    391 FIN_WAIT2
   5081 LAST_ACK
      2 LISTEN
    203 SYN_RECV
     66 TIME_WAIT

检查一下LAST_ACK所对应的应用
[root@ccsafe ~]# netstat -ant|fgrep "LAST_ACK"|cut -b 49-75|cut -d ":" -f1|sort |uniq -c|sort -nr --key=1,7|head -5
    101 220.160.210.6
     46 222.75.65.69
     31 221.0.91.118
     24 222.210.8.160
     22 60.161.81.28
[root@ccsafe ~]#

[root@ccsafe ~]# netstat -an|grep "220.160.210.6"
tcp        0 17280 10.1.1.145:80           220.160.210.6:52787         ESTABLISHED
tcp        1 14401 10.1.1.145:80           220.160.210.6:52513         LAST_ACK   
tcp        1 14401 10.1.1.145:80           220.160.210.6:52769         LAST_ACK   
tcp        1 14401 10.1.1.145:80           220.160.210.6:52768         LAST_ACK   
tcp        0   8184 10.1.1.145:80           220.160.210.6:52515         LAST_ACK   
tcp        1 14401 10.1.1.145:80           220.160.210.6:52514         LAST_ACK   
tcp        0   8184 10.1.1.145:80           220.160.210.6:52781         LAST_ACK


是TCP80端口的应用,调节一下nginx的keepalive时间...
[root@ccsafe ~]# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
2008/10/21 19:15:31 [info] 21352#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
2008/10/21 19:15:31 [info] 21352#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
[root@ccsafe ~]# ps aux|egrep '(PID|nginx)'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      8290 0.0 0.0   7572 1124 ?        Ss   Oct04   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    8291 0.2 0.3 19704 13776 ?        S    Oct04 71:35 nginx: worker process     
nobody    8292 0.3 0.2 17604 11680 ?        S    Oct04 77:26 nginx: worker process     
nobody    8293 0.2 0.4 22528 16636 ?        S    Oct04 58:13 nginx: worker process     
nobody    8294 0.3 0.4 24944 19020 ?        S    Oct04 94:07 nginx: worker process     
nobody    8295 0.3 0.5 27496 21508 ?        S    Oct04 84:41 nginx: worker process     
nobody    8296 0.3 0.1 13388 7496 ?        S    Oct04 84:14 nginx: worker process     
nobody    8297 0.2 0.0   9196 3268 ?        S    Oct04 58:21 nginx: worker process     
nobody    8298 0.3 0.2 15392 9504 ?        S    Oct04 75:16 nginx: worker process     
root     21354 0.0 0.0   3896   720 pts/0    S+   19:15   0:00 egrep (PID|nginx)
(动态加载新配置)
[root@ccsafe ~]# kill -HUP 8290
[root@ccsafe ~]#

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90 |sort |uniq -c

1 CLOSE_WAIT
   1138 CLOSING
   7161 ESTABLISHED
   1427 FIN_WAIT1
    396 FIN_WAIT2
   5740 LAST_ACK
      2 LISTEN
    350 SYN_RECV
    148 TIME_WAIT

...

[root@ccsafe ~]# netstat -ant|fgrep ":"|cut -b 77-90 |sort |uniq -c
   1151 CLOSING    
   8506 ESTABLISHED
   1452 FIN_WAIT1  
    666 FIN_WAIT2  
   6568 LAST_ACK   
      2 LISTEN     
    429 SYN_RECV   
     92 TIME_WAIT

...


LAST_ACK不下,而且CLOSING 和FIN_WAIT突增

着重看看可影响主动断开TCP连接时几个参数
tcp_keepalive_intvl:探测消息发送的频率
tcp_keepalive_probes:TCP发送keepalive探测以确定该连接已经断开的次数
tcp_keepalive_time:当keepalive打开的情况下,TCP发送keepalive消息的频率

[root@ccsafe ~]# sysctl -a|grep tcp_keepalive
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 160

tcp_retries2:在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试
[root@ccsafe ~]# sysctl -a |grep tcp_retries
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_retries1 = 3

加速处理那些等待ACK的LAST_ACK,减少等待ACK的LAST_ACK的重试次数
[root@ccsafe ~]# sysctl -w net.ipv4.tcp_retries2=5
net.ipv4.tcp_retries2 = 5

减少keepalive发送的频率
[root@ccsafe ~]# sysctl -w net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_intvl = 15
[root@ccsafe ~]# sysctl -p

排除syncookies的影响
[root@ccsafe ~]# !ec
echo "0" >/proc/sys/net/ipv4/tcp_syncookies
[root@ccsafe ~]# echo "1" >/proc/sys/net/ipv4/tcp_syncookies

[root@ccsafe ~]# sysctl -a|grep tcp_keepalive              
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 160

[root@ccsafe ~]# sysctl -a|grep syncookies
net.ipv4.tcp_syncookies = 1

延长keepalive检测周期,保留ESTABLISHED数量
[root@ccsafe ~]# echo "1800" >/proc/sys/net/ipv4/tcp_keepalive_time
[root@ccsafe ~]# echo "5" >/proc/sys/net/ipv4/tcp_keepalive_probes
[root@ccsafe ~]# echo "15" >/proc/sys/net/ipv4/tcp_keepalive_intvl
[root@ccsafe ~]# sysctl -a|grep tcp_keepalive                     
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800

[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
    363 CLOSING
   5145 ESTABLISHED
   1073 FIN_WAIT1
    174 FIN_WAIT2
   6042 LAST_ACK
      2 LISTEN
    301 SYN_RECV
     85 TIME_WAIT


LAST_ACK不下,但是CLOSING有所回落
tcp_orphan_retries:在近端丢弃TCP连接之前﹐要进行多少次重试。
[root@ccsafe ~]# sysctl -a|grep tcp_orphan
net.ipv4.tcp_orphan_retries = 0

关键,丢TCP太频繁了,以至于后勤都跟不上。设置丢弃之前的重试次数
[root@ccsafe ~]# echo "3" >/proc/sys/net/ipv4/tcp_orphan_retries
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
     24 CLOSING
   5422 ESTABLISHED
    279 FIN_WAIT1
    214 FIN_WAIT2
   1966 LAST_ACK
      2 LISTEN
    269 SYN_RECV
     74 TIME_WAIT

上下调节该值,找个合适的临界点
[root@ccsafe ~]# echo "7" >/proc/sys/net/ipv4/tcp_orphan_retries                
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
    175 CLOSING
   5373 ESTABLISHED
    436 FIN_WAIT1
    209 FIN_WAIT2
   3184 LAST_ACK
      2 LISTEN
    283 SYN_RECV
    110 TIME_WAIT

恢复,同时FIN_WAIT1的值过高。考虑减少tcp_fin_timeout时间
[root@ccsafe ~]# echo "2" >/proc/sys/net/ipv4/tcp_orphan_retries

[root@ccsafe ~]# sysctl -a|grep tcp_fin
net.ipv4.tcp_fin_timeout = 10

[root@ccsafe ~]# echo "5" >/proc/sys/net/ipv4/tcp_fin_timeout
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

2 CLOSE_WAIT
     17 CLOSING
   5665 ESTABLISHED
    145 FIN_WAIT1
    141 FIN_WAIT2
   1068 LAST_ACK
      2 LISTEN
    287 SYN_RECV
     68 TIME_WAIT

相比FIN_WAIT,SYN_RECV的值偏高。加大发送synack的质量
[root@ccsafe ~]# sysctl -a|grep synack
net.ipv4.tcp_synack_retries = 1
[root@ccsafe ~]# echo "2" >/proc/sys/net/ipv4/tcp_synack_retries
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

3 CLOSE_WAIT
     16 CLOSING
   5317 ESTABLISHED
    200 FIN_WAIT1
    158 FIN_WAIT2
   1001 LAST_ACK
      2 LISTEN
    303 SYN_RECV
     78 TIME_WAIT

[root@ccsafe ~]# sysctl -a|grep keepalive
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800
[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
      7 CLOSING
   5356 ESTABLISHED
    175 FIN_WAIT1
    136 FIN_WAIT2
   1045 LAST_ACK
      2 LISTEN
    345 SYN_RECV
     64 TIME_WAIT

减少keepalive的检测周期,LAST_ACK上升
[root@ccsafe ~]# echo "10" >/proc/sys/net/ipv4/tcp_keepalive_intvl
[root@ccsafe ~]# echo "1" >/proc/sys/net/ipv4/tcp_synack_retries                
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
     13 CLOSING
   5605 ESTABLISHED
    212 FIN_WAIT1
    131 FIN_WAIT2
   1143 LAST_ACK
      2 LISTEN
    252 SYN_RECV
     79 TIME_WAIT

恢复
[root@ccsafe ~]# echo "15" >/proc/sys/net/ipv4/tcp_keepalive_intvl

[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

3 CLOSE_WAIT
     14 CLOSING
   5862 ESTABLISHED
    230 FIN_WAIT1
    205 FIN_WAIT2
   1064 LAST_ACK
      2 LISTEN
    244 SYN_RECV
     59 TIME_WAIT


[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

3 CLOSE_WAIT
     26 CLOSING
   6712 ESTABLISHED
    270 FIN_WAIT1
    230 FIN_WAIT2
    994 LAST_ACK
      2 LISTEN
    254 SYN_RECV
     73 TIME_WAIT


[root@ccsafe ~]#

目前LAST_ACK占ESTABLISHED的量在15%左右

转载于:https://my.oschina.net/lionel45/blog/142513

相关文章:

操作系统--内存管理方式

“碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分 配方法决定内存碎片是否是一个问题&…

题解 UVA11354 【Bond】

并查集按秩合并 传送门 大意:给出一张n个点m条边的无向图, 每条边有一个权值,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的边的最大权值最小。 我们可以发现,跑最小生成树会跑挂&…

管理 zabbix_Zabbix 2019 峰会丨看睿象云如何在 Zabbix 中玩转告警

2019年11月29日-30日,为期两天的 Zabbix 大会中国站在北京盛大召开,本届 Zabbix 大会以“新视界,新技术,共建未来新监控!”为主题,为与会人员提供前沿的监控技术学习,多元的行业案例讲解,以及现…

Oracle存储过程返回游标实例详解

复制代码 代码如下:CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT VARCHAR2, P_SUB VARCHAR2, P_SENDOR VARCHAR2, P_RECEIVER VARCHAR2, P_SERVER VARCHAR2, P_PORT NUMBER DEFAULT 25, P_NEED_SMTP INT DEFAULT 0, P_USER VARCHAR2 DEFAULT NULL, P_PASS VARCHAR2 DEFAUL…

03 Django REST Framework 视图和路由

01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。 比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据…

[Quick-x]制作新手引导高亮区域方法之二:裁剪模式

demo下载:https://github.com/chenquanjun/Quick-x-HighlightArea 2、裁剪模式 (1)创建裁剪对象 local bgColor ccc3(255, 0, 0) --非高亮区域颜色local bgOpacity 0.6 --非高亮区域透明度local layerColor CCLayerColor:create(ccc4(bgColor.r, bgColor.g, bgCo…

单一窗口关区备案_单一窗口税费支付权限管理

企业需先使用法人卡登录“单一窗口”税费支付系统进行业务权限授权后,才可以使用操作员卡查询、支付、打印税单等。“业务权限授权”模块提供税费支付企业相关业务权限(关区、协议)的授权功能。使用“单一窗口”税费支付系统的部门、用户、角色管理与权限配置等操作…

每日一题题目29:五个数字能组成多少互不重复的四位数

#有五个数字:1、2、3、4、5,能组成多少个互不相同且无重复数字的四位数?各是多少? e [] for a in range(1,6):for b in range(1,6):for c in range(1,6):for d in range(1,6):if a!b and a!c and a!d and b!c and b!d and c!d:e.a…

读书:历史 -- 空王冠

15世纪50到80年代的玫瑰战争,短短30年间王冠易手7次,成千上万人死于战乱。这段时期,可以算得上英国历史上最混乱、最残暴的历史时期。 英国统治时间最长的金雀花王朝分崩离析,被都铎王朝取代。

机器人香囊_青少年智能机器人等级评定~户外营~圆满结束!

2020暑期田园探秘~青少年智能机器人等级评定户外营在8月3日至7日短暂而愉快的欢乐时光中圆满结束了让我们一起来回顾一下这愉快、欢乐、体验成长的时光孩子们在激动的心情下踏上了探秘的欢快路途......初到营地的第一件事~组建团队~首先让大家见识一下我们的团队我们的团队由&a…

Linux下DB2数据库安装教程

最近因为工作需要在学习DB2数据库,本教程讲解DB2数据库在inux下的安装步骤。 安装前请查看 DB2版本和许可证 说明来增加了解,先弄明白改安装什么版本,这里我用的是最新的Express-C版本,这个版本是提供给个人学习用的版本。 管理客…

Ubuntu 13.04 安装 OpenCV 及试用

2019独角兽企业重金招聘Python工程师标准>>> 暑假来了,项目需要,得学习一下 OpenCV。 首先,是安装问题。我是参照这个网址安装的:http://karytech.blogspot.com/2012/05/opencv-24-on-ubuntu-1204.html(在…

Python3 调试技巧 —— 死循环

说下Python3不使用gdb的自身调试 前情提要:服务器莫名卡死,用网上的方法用gdb,下载了很多组件,包括那个libpython.py,都没什么用,看不到堆栈,也试了保存core文件等等 大事找官方:官方…

读书:历史 -- 奥斯曼帝国六百年

作者:帕特里克贝尔福 ,英国历史学家、作家、记者。 本书为作者写作生涯的集大成之作,也是最终之作 一部奥斯曼帝国通史: 伊斯兰教大帝国的兴起、转折、衰败和灭亡 奥斯曼帝国的发家史和我们的大清帝国十分相似,两者都…

单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器

http://www.amobbs.com/thread-4503884-1-1.html 这个小玩意,采用 ATMEL 的传统51MCU作主控制芯片,加上SD卡和显示屏,就可以作简单的音乐播放器了,虽然音质不怎么样,不过作为DIY还是蛮有乐趣,希望大家喜欢。…

不带头节点的链表有哪些缺点_23张图!万字详解「链表」,从小白到大佬!

链表和数组是数据类型中两个重要又常用的基础数据类型。数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解决和平衡此问题于是就有了链表…

劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(一)

《写给大家看的C语言书(第2版)》是邮电社图灵公司引进翻译的一本C语言入门书,这是一本垃圾书。搞不清图灵为什么引进了这样一本垃圾书。该书作者基本不懂得C编程技术,书中误导、错谬比比皆是。  该书的附录B给出了一个21点游戏的代码,这是一…

【数学 技巧】2.14计数

有趣的组合数学题;考试时候打满确实挺不容易的…… 题目描述 对于一个 $n$ 阶排列 $p$,我们建立一张无向简单图 $G(p)$,有 $n$ 个节点,标号从 $1$ 到 $n$,每个点向左右两侧最近的比它大的点以及比它小的点连边。 形式化…

冒泡排序 算法

算法思路&#xff1a; 从第一个元素开始遍历&#xff0c;比较当前元素和下一个元素的大小不符合&#xff0c;则交换结束最后一个元素&#xff0c;则重新遍历 实现&#xff1a; void bubble_sort(vector<int> &arr) {for (int i 0;i < arr.size() - 1; i) {//交…

5单个编译总会编译全部_5分钟读懂JavaScript预编译

大家都知道JavaScript是解释型语言&#xff0c;既然是解释型语言&#xff0c;就是编译一行&#xff0c;执行一行&#xff0c;那又何来预编译一说呢?脚本执行js引擎都做了什么呢&#xff1f;今天我们就来看看吧。1-JavaScript运行三部曲语法分析预编译解释执行语法分析很简单&a…

2014百度面试题目---“求比指定整数大且最小的不重复数”解答

题目&#xff1a;给定任意一个正整数&#xff0c;求比这个数大且最小的“不重复数”&#xff0c;“不重复数”的含义是相邻两位不相同&#xff0c;例如1101是重复数&#xff0c;而1201是不重复数。 代码&#xff1a; #include <iostream> using namespace std;bool istha…

3DMAX 批量 场景 对象 导出 .X格式 脚本

一、首先你需要下载一个 Total Commader文件管理软件。利用这个软件你可以收集文件夹下包含子文件夹下的max文件&#xff08;或完整路径&#xff09;打开TotalCMD后使用查找文件&#xff1a;&#xff08;如图红框中的操作&#xff09;1.2.3. 复制文件名和完整路径后粘贴到文本文…

C++复数类面向对象的参考

#include <bits/stdc.h> #include <future> #include <thread>using namespace std;class Complex { public:Complex (double r 0, double i 0): re (r), im (i) {} ///冒号后面是初始化的过程&#xff0c;注意分清初始化和赋值的区别Comp…

快速排序 算法

算法思路 序列终任意选择一个数&#xff0c;把序列分为比这个数大和比这个数小的两个子序列不断重复以上步骤(递归) 代码实现 int partition1(vector<int> &arr, int begin , int end) {int ret arr[begin];int index begin 1;for (int i index;i < end; i…

利用Spring AOP与JAVA注解为系统增加日志功能

Spring AOP一直是Spring的一个比较有特色的功能&#xff0c;利用它可以在现有的代码的任何地方&#xff0c;嵌入我们所想的逻辑功能&#xff0c;并且不需要改变我们现有的代码结构。 鉴于此&#xff0c;现在的系统已经完成了所有的功能的开发&#xff0c;我们需要把系统的操作日…

maven引入hadoop_如何添加Hadoop依赖通过Maven

匿名用户1级2017-09-09 回答Hadoop开发中需要用到至少不下10个的依赖包&#xff0c;它们相互间的依赖关系比较复杂&#xff0c;不同版本的依赖关系也有所不同&#xff0c;而间接依赖导致的程序错误并不会在运行之前报错&#xff0c;因此确定适合一个版本的依赖包&#xff0c;会…

js 闭包作用

2019独角兽企业重金招聘Python工程师标准>>> 一、变量的作用域 要理解闭包&#xff0c;首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种&#xff1a;全局变量和局部变量。 Javascript语言的特殊之处&#xff0c;就在于函数内部可以直接读取全…

vue实用组件——页面公共头部

可伸缩自适应的页面头部&#xff0c;屏幕适应范围更广泛 效果如下&#xff1a; 代码如下&#xff1a; <template> <div class"site-header"> <div class"logo"><img src"/assets/icons/logo.png" alt"">&…