• 关于 linux 栈信息 的搜索结果

回答

打印线程的堆栈信息: jstack pid |grep tid -A 30 1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。 2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。 3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。 4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。

谙忆 2019-12-02 03:08:21 0 浏览量 回答数 0

回答

每一个进程都有自己的内存虚拟地址空间,内存最小的单位是页(page).虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被CPU引用.Linux默认的栈(stack)大小为8MB.用户进程部分分段存储内容如下所示(从内存高地址到低地址):栈(stack): 函数参数、返回地址、局部变量等堆(heap): malloc(C)/new(C++)动态分配的内存BSS段(bss): 未初始化或初值为0的全局变量和静态局部变量数据段(data): 已初始化且初值非0的全局变量和静态局部变量代码段(text): 可执行代码、字符串字面值、只读变量详细解释:1.内核空间内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。2.栈(stack)栈又称堆栈,由编译器自动分配释放,行为类似数据结构中的栈(先进后出)。堆栈主要有三个用途:(1)为函数内部声明的非静态局部变量(C语言中称“自动变量”)提供存储空间。(2)记录函数调用过程相关的维护性信息,称为栈帧(Stack Frame)或过程活动记录(Procedure Activation Record)。它包括函数返回地址,不适合装入寄存器的函数参数及一些寄存器值的保存。除递归调用外,堆栈并非必需。因为编译时可获知局部变量,参数和返回地址所需空间,并将其分配于BSS段。(3)临时存储区,用于暂存长算术表达式部分计算结果或alloca()函数分配的栈内内存。持续地重用栈空间有助于使活跃的栈内存保持在CPU缓存中,从而加速访问。进程中的每个线程都有属于自己的栈。向栈中不断压入数据时,若超出其容量就会耗尽栈对应的内存区域,从而触发一个页错误。此时若栈的大小低于堆栈最大值RLIMIT_STACK(Linux通常是8M),则栈会动态增长,程序继续运行。映射的栈区扩展到所需大小后,不再收缩。Linux中ulimit -s命令可查看和设置堆栈最大值,当程序使用的堆栈超过该值时, 发生栈溢出(Stack Overflow),程序收到一个段错误(Segmentation Fault)。注意,调高堆栈容量可能会增加内存开销和启动时间。堆栈既可向下增长(向内存低地址)也可向上增长, 这依赖于具体的实现。本文所述堆栈向下增长。堆栈的大小在运行时由内核动态调整。3.内存映射段(mmap)此处,内核将硬盘文件的内容直接映射到内存,任何应用程序都可通过Linux的mmap()系统调用或Windows的CreateFileMapping()/MapViewOfFile()请求这种映射。内存映射是一种方便高效的文件I/O方式,因而被用于装载动态共享库。用户也可创建匿名内存映射,该映射没有对应的文件,可用于存放程序数据。在Linux中,若通过malloc()请求一大块内存,C运行库将创建一个匿名内存映射,而不使用堆内存。“大块”意味着比阈值MMAP_THRESHOLD还大,缺省为128KB,可通过mallopt()调整。该区域用于映射可执行文件用到的动态链接库。在Linux 2.4内核中,若可执行文件依赖共享库,则系统会为这些动态库在从0x40000000开始的地址分配相应空间,并在程序装载时将其载入到该空间。在Linux 2.6内核中,共享库的起始地址被往上移动至更靠近栈区的位置。从进程地址空间的布局可以看到,在有共享库的情况下,留给堆的可用空间还有两处:一处是从BSS段到0x40000000,约不到1GB的空间;另一处是从共享库到栈之间的空间,约不到2GB。这两块空间大小取决于栈、共享库的大小和数量。这样来看,是否应用程序可申请的最大堆空间只有2GB?事实上,这与Linux内核版本有关。在上面给出的进程地址空间经典布局图中,共享库的装载地址为0x40000000,这实际上是Linux kernel 2.6版本之前的情况了,在2.6版本里,共享库的装载地址已经被挪到靠近栈的位置,即位于0xBFxxxxxx附近,因此,此时的堆范围就不会被共享库分割成2个“碎片”,故kernel 2.6的32位Linux系统中,malloc申请的最大内存理论值在2.9GB左右。4.堆(heap)堆用于存放进程运行时动态分配的内存段,可动态扩张或缩减。堆中内容是匿名的,不能按名字直接访问,只能通过指针间接访问。当进程调用malloc(C)/new(C++)等函数分配内存时,新分配的内存动态添加到堆上(扩张);当调用free(C)/delete(C++)等函数释放内存时,被释放的内存从堆中剔除(缩减) 。分配的堆内存是经过字节对齐的空间,以适合原子操作。堆管理器通过链表管理每个申请的内存,由于堆申请和释放是无序的,最终会产生内存碎片。堆内存一般由应用程序分配释放,回收的内存可供重新使用。若程序员不释放,程序结束时操作系统可能会自动回收。堆的末端由break指针标识,当堆管理器需要更多内存时,可通过系统调用brk()和sbrk()来移动break指针以扩张堆,一般由系统自动调用。使用堆时经常出现两种问题:(1) 释放或改写仍在使用的内存(“内存破坏”);(2) 未释放不再使用的内存(“内存泄漏”)。当释放次数少于申请次数时,可能已造成内存泄漏。泄漏的内存往往比忘记释放的数据结构更大,因为所分配的内存通常会圆整为下个大于申请数量的2的幂次(如申请212B,会圆整为256B)。注意,堆不同于数据结构中的”堆”,其行为类似链表。5.BSS段BSS(Block Started by Symbol)段中通常存放程序中以下符号:未初始化的全局变量和静态局部变量.初始值为0的全局变量和静态局部变量(依赖于编译器实现).未定义且初值不为0的符号(该初值即common block的大小).C语言中,未显式初始化的静态分配变量被初始化为0(算术类型)或空指针(指针类型)。由于程序加载时,BSS会被操作系统清零,所以未赋初值或初值为0的全局变量都在BSS中。BSS段仅为未初始化的静态分配变量预留位置,在目标文件中并不占据空间,这样可减少目标文件体积。但程序运行时需为变量分配内存空间,故目标文件必须记录所有未初始化的静态分配变量大小总和(通过start_bss和end_bss地址写入机器代码)。当加载器(loader)加载程序时,将为BSS段分配的内存初始化为0。在嵌入式软件中,进入main()函数之前BSS段被C运行时系统映射到初始化为全零的内存(效率较高)。注意,尽管均放置于BSS段,但初值为0的全局变量是强符号,而未初始化的全局变量是弱符号。若其他地方已定义同名的强符号(初值可能非0),则弱符号与之链接时不会引起重定义错误,但运行时的初值可能并非期望值(会被强符号覆盖)。因此,定义全局变量时,若只有本文件使用,则尽量使用static关键字修饰;否则需要为全局变量定义赋初值(哪怕0值),保证该变量为强符号,以便链接时发现变量名冲突,而不是被未知值覆盖。某些编译器将未初始化的全局变量保存在common段,链接时再将其放入BSS段。在编译阶段可通过-fno-common选项来禁止将未初始化的全局变量放入common段。此外,由于目标文件不含BSS段,故程序烧入存储器(Flash)后BSS段地址空间内容未知。U-Boot(一个嵌入式操作系统引导程序)启动过程中,将U-Boot的Stage2代码(通常位于lib_xxxx/board.c文件)搬迁(拷贝)到SDRAM空间后必须人为添加清零BSS段的代码,而不可依赖于Stage2代码中变量定义时赋0值。BSS段不包含数据,仅维护开始和结束地址,以便内存能在运行时被有效地清零。BSS所需的运行时空间由目标文件记录,但BSS并不占用目标文件内的实际空间,即BSS节段应用程序的二进制映象文件中并不存在。6.数据段(data)数据段通常用于存放程序中已初始化且初值不为0的全局变量和静态局部变量。数据段属于静态内存分配(静态存储区),可读可写。数据段保存在目标文件中(在嵌入式系统里一般固化在镜像文件中),其内容由程序初始化。例如,对于全局变量int gVar = 10,必须在目标文件数据段中保存10这个数据,然后在程序加载时复制到相应的内存。数据段与BSS段的区别如下: (1) BSS段不占用物理文件尺寸,但占用内存空间;数据段占用物理文件,也占用内存空间。对于大型数组如int ar0[10000] = {1, 2, 3, ...}和int ar1[10000],ar1放在BSS段,只记录共有10000*4个字节需要初始化为0,而不是像ar0那样记录每个数据1、2、3...,此时BSS为目标文件所节省的磁盘空间相当可观。(2) 当程序读取数据段的数据时,系统会发出缺页故障,从而分配相应的物理内存;当程序读取BSS段的数据时,内核会将其转到一个全零页面,不会发生缺页故障,也不会为其分配相应的物理内存。运行时数据段和BSS段的整个区段通常称为数据区。某些资料中“数据段”指代数据段 + BSS段 + 堆。7.代码段(text)代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。一般C语言执行语句都编译成机器代码保存在代码段。通常代码段是可共享的,因此频繁执行的程序只需要在内存中拥有一份拷贝即可。代码段通常属于只读,以防止其他程序意外地修改其指令(对该段的写操作将导致段错误)。某些架构也允许代码段为可写,即允许修改程序。代码段指令根据程序设计流程依次执行,对于顺序指令,只会执行一次(每个进程);若有反复,则需使用跳转指令;若进行递归,则需要借助栈来实现。代码段指令中包括操作码和操作对象(或对象地址引用)。若操作对象是立即数(具体数值),将直接包含在代码中;若是局部数据,将在栈区分配空间,然后引用该数据地址;若位于BSS段和数据段,同样引用该数据地址。代码段最容易受优化措施影响。8.保留区(reservd)位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。它并不是一个单一的内存区域,而是对地址空间中受到操作系统保护而禁止用户进程访问的地址区域的总称。大多数操作系统中,极小的地址通常都是不允许访问的,如NULL。C语言将无效指针赋值为0也是出于这种考虑,因为0地址上正常情况下不会存放有效的可访问数据。在32位x86架构的Linux系统中,用户进程可执行程序一般从虚拟地址空间0x08048000开始加载。该加载地址由ELF文件头决定,可通过自定义链接器脚本覆盖链接器默认配置,进而修改加载地址。0x08048000以下的地址空间通常由C动态链接库、动态加载器ld.so和内核VDSO(内核提供的虚拟共享库)等占用。通过使用mmap系统调用,可访问0x08048000以下的地址空间。

a123456678 2019-12-02 02:41:17 0 浏览量 回答数 0

问题

怎么样再linux下查看dump_stack()函数打印出来的信息?

杨冬芳 2019-12-01 20:24:57 1272 浏览量 回答数 1

Linux运维学习路线 20门免费课程

从事云计算运维相关工作必备技能

回答

一:C语言 嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。 二:Linux基础 Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。 三:Linux系统编程 重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。 四:Linux网络编程 计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。 五:数据结构与算法 数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。 六:C++ 、QT C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。 七:Cortex A8 、Linux 平台开发 通过基于ARM Cortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android操作系统开发流程。Android系统是基于Linux平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。 八:驱动开发 驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARM Cortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。 以上就是列出的关于一名合格嵌入式Linux开发工程师所必学的理论知识,其实,作为一个嵌入式开发人员,专业知识和项目经验同样重要,所以在我们的理论学习中也要有一定的项目实践,锻炼自己的项目开发能力。

知与谁同 2019-12-02 01:22:27 0 浏览量 回答数 0

回答

Linux内核栈溢出(stack overflow)问题 最近一段时间在设计和开发一个Linux内核模块,进入到最后的正确性测试与稳定性测试阶段。在这个阶段发现了一个非常有意思的问题,堆栈溢出(stack overflow)。Linux内核堆栈溢出之后直接导致了系统kernel Panic。由于导致stack overflow的原因是递归调用导致的,所以,最后通过调试串口导出的kernel panic信息很快就定位问题所在了,否则这样的问题还真是很难调试和发现。通过这次bug,我们应该记住的是:Linux内核stack资源是有限的,而递归调用将大量消耗stack资源,因此在内核编程中尽量少用递归算法,否则将会导致出乎意料的一些问题。依次类推,为了减少stack资源的消耗,程序的局部变量定义的不要太大,否则也将会消耗大量stack资源,从而导致内核程序的不稳定。 为了解决递归调用导致的问题,我将递归算法改写成了非递归算法,解决了stack overflow的问题。在此介绍一下递归算法改写成非递归算法的一些思想。在项目实现过程中,需要对IO请求进行按顺序排队,因此采用了效率较高并且实现简单的快速排序算法,该算法是一种分治算法,即将排序队列进行切分,分解成一系列的小问题进行求解,针对这种问题,很容易采用递归的办法进行实现,伪代码描述如下: /* qs_sort实现从小到大的排序 */ Struct bio qs_sort(struct bio_list *list_head, struct bio *bio_tail) { Struct bio_list *less_list, *large_list; Struct bio *middle_bio; /* 递归调用结束点,小问题求解完毕,直接返回最后一个元素 */ If (!list_head) { Return bio_tail; } /* 对队列进行切分,选择一个middle_bio,并且按照middle_bio将其切分成less_list队列和large_list队列 */ Split_list(list_head, less_list, large_list, &middle_bio); /* 采用递归的方法实现大队列的排序操作 */ Middle_bio->bi_next = qs_sort(large_list, bio_tail); /* 采用递归的方法实现小队列的排序操作 */ Return qs_sort(less_list, middle_bio); }

liujae 2019-12-02 01:24:29 0 浏览量 回答数 0

回答

在本地开发环境测试Node.js应用,需要准备相关的开发环境。本文将介绍Node.js开发环境的设置步骤,并提供相关工具的安装页面链接。 安装Node.js 在Node.js官方网站下载安装包。 说明 为了和Web+的技术栈版本更好兼容,建议您下载Node.js 10.16.x或Node.js 8.16.x。 Linux 进入Node.js安装包(例如node-v10.16.3-linux-x64.tar.xz)所在目录,执行以下命令将安装包解压到/usr/local目录下。 sudo tar -C /usr/local -xzf node-v10.16.3-linux-x64.tar.xz 执行以下命令创建软链接/usr/local/node指向刚解压的安装包路径。 sudo ln -s /usr/local/node-v10.16.3-linux-x64 /usr/local/node 解压后将可执行文件目录配置到Path环境变量,将以下命令添加到$HOME/.profile。 export PATH=$PATH:/usr/local/node/bin 执行以下命令使环境变量立即生效。 source $HOME/.profile 使用以下命令验证Node.js是否安装成功。 node --version && npm --version 如果显示如下信息,则说明安装包已成功安装。 v10.16.0 6.9.0 macOS 执行以下命令使用brew来快速安装Node.js。 brew update && brew install node Windows 进入Node.js安装包所在目录,运行下载的.msi文件即可安装,无需其他配置。 安装IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供应用开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具,可以显著提高开发效率。以下是Node.js开发中常用的IDE,但下列IDE可能需要通过安装插件来支持Node.js开发。 Visual Studio Code Atom WebStorm(商业软件)

1934890530796658 2020-03-23 14:20:15 0 浏览量 回答数 0

问题

【开源分享】- 常用JDK原生指令2期

montos 2020-04-29 12:57:01 131 浏览量 回答数 1

问题

监控工具Ntop性能提升方案

opensiem 2019-12-01 21:46:21 2028 浏览量 回答数 0

回答

本文为您介绍如何使用资源编排服务(ROS)的Python SDK来创建和管理资源栈。 背景信息 您除了可以在ROS控制台创建资源栈,还可以使用API代码来创建和管理资源栈。 准备工作 下载及安装Python SDK。 使用pip安装aliyun-python-sdk-core。 pip install aliyun-python-sdk-core 说明 aliyun-python-sdk-core是所有阿里云官方Python SDK的公共组件。如果安装过程提示权限错误,可能是因为您没有Python安装路径的写权限。此命令也可以改为sudo pip install aliyun-python-sdk-core。 安装ROS SDK。 pip install aliyun-python-sdk-ros 初始化SDK。 导入相关的包。 from aliyunsdkcore.client import AcsClient from aliyunsdkros.request.v20190910.CreateStackRequest import CreateStackRequest from aliyunsdkros.request.v20190910.GetStackRequest import GetStackRequest from aliyunsdkros.request.v20190910.DeleteStackRequest import DeleteStackRequest from aliyunsdkros.request.v20190910.DescribeRegionsRequest import DescribeRegionsRequest from aliyunsdkros.request.v20190910.ListStacksRequest import ListStacksRequest 初始化SDK客户端对象。 AK = ' ' SECRET = ' ' Region = ' ' client = AcsClient(AK, SECRET, Region) 注意 示例中的命令行都使用Linux的shell,如果您是Windows/DOS用户,则需要根据情况修改。 ROS Python SDK依赖Python 2.7以上版本。 ROS Python SDK 3.0.0及以上版本,支持v20150901版和v20190910版API。 查询可用地域列表 您可以使用Python SDK查询可用地域列表。 def describe_region(): """describe regions list """ request = DescribeRegionsRequest() request.set_connect_timeout(10000) request.set_read_timeout(10000) request.set_accept_format("json") response = client.do_action_with_exception(request) return response.decode("utf-8") 创建资源栈 创建资源栈时,您必须指定以下参数: StackName:将要创建的资源栈的名称。每个用户空间下的资源栈名称不能重复。 TimeoutInMinutes:创建过程如果在指定的时间后不能完成则超时失败。单位为分钟。 TemplateBody:创建的资源栈使用的模板内容。 TemplateURL:模板主体的文件的位置。必须指定TemplateBody或TemplateURL,但不能同时指定两者。 Parameters:创建的资源栈所需要的参数。需要在模板中定义key。 stack_name = "MyStack" timeout = 10 template_body = """ { "ROSTemplateFormatVersion": "2015-09-01", "Parameters": { "VpcName": { "Type": "String", "Description": "Vpc Name", "Label": "Vpc Name" }, "CidrBlock": { "Type": "String", "Description": "Vpc CidrBlock", "Label": "Vpc CidrBlock" } }, "Resources": { "Vpc": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": { "Ref": "CidrBlock" }, "VpcName": { "Ref": "VpcName" } } } } } """ params = [ { "ParameterValue": "192.168.0.0/16", "ParameterKey": "CidrBlock" }, { "ParameterValue": "TestVpc", "ParameterKey": "VpcName" } ] def create_stack(): """create stack""" request = CreateStackRequest() request.set_accept_format("json") request.set_StackName(stack_name) request.set_TimeoutInMinutes(timeout) request.set_TemplateBody(template_body) request.set_Parameterss(params) response = client.do_action_with_exception(request) return response.decode("utf-8") 查询资源栈 您需要输入对应资源栈的ID。 def get_stack(): """get descriptions of the stack""" request = GetStackRequest() request.set_accept_format("json") request.set_StackId(stack_id) response = client.do_action_with_exception(request) return response.decode("utf-8") 删除资源栈 您需要输入对应资源栈的ID。 def delete_stack(): """delete stack""" request = DeleteStackRequest() request.set_accept_format("json") request.set_StackId(stack_id) response = client.do_action_with_exception(request) return response.decode("utf-8") 操作样例 import json from time import sleep from aliyunsdkcore.client import AcsClient from aliyunsdkros.request.v20190910.CreateStackRequest import CreateStackRequest from aliyunsdkros.request.v20190910.GetStackRequest import GetStackRequest from aliyunsdkros.request.v20190910.DeleteStackRequest import DeleteStackRequest from aliyunsdkros.request.v20190910.DescribeRegionsRequest import DescribeRegionsRequest from aliyunsdkros.request.v20190910.ListStacksRequest import ListStacksRequest AK = ' ' SECRET = ' ' Region = ' ' # 例如:'cn-beijing'、'cn-hangzhou' client = AcsClient(AK, SECRET, Region) def describe_region(): """describe regions list """ request = DescribeRegionsRequest() request.set_connect_timeout(10000) request.set_read_timeout(10000) request.set_accept_format("json") response = client.do_action_with_exception(request) return response.decode("utf-8") def create_stack(stack_name, timeout, template_body, params=[]): """create stack""" request = CreateStackRequest() request.set_accept_format("json") request.set_StackName(stack_name) request.set_TimeoutInMinutes(timeout) request.set_TemplateBody(template_body) response = client.do_action_with_exception(request) return response.decode("utf-8") def get_stack(stack_id): """get descriptions of the stack""" request = GetStackRequest() request.set_accept_format("json") request.set_StackId(stack_id) response = client.do_action_with_exception(request) return response.decode("utf-8") def delete_stack(stack_id): """delete stack""" request = DeleteStackRequest() request.set_accept_format("json") request.set_StackId(stack_id) response = client.do_action_with_exception(request) return response.decode("utf-8") if name == 'main': test_template = """ { "ROSTemplateFormatVersion": "2015-09-01", "Parameters": { "VpcName": { "Type": "String", "Description": "Vpc Name", "Label": "Vpc Name" }, "CidrBlock": { "Type": "String", "Description": "Vpc CidrBlock", "Label": "Vpc CidrBlock" } }, "Resources": { "Vpc": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": { "Ref": "CidrBlock" }, "VpcName": { "Ref": "VpcName" } } } } } """ parameters = [ {"ParameterKey": "CidrBlock", "ParameterValue": "192.168.0.0/16"}, {"ParameterKey": "VpcName", "ParameterValue": "TestVpc"} ] describe_region() stack = create_stack('MyStack', 10, test_template, parameters) get_stack(json.loads(stack)["StackId"]) sleep(3) # 等待创建资源栈任务执行完毕 delete_stack(json.loads(stack)["StackId"])

1934890530796658 2020-03-24 19:31:37 0 浏览量 回答数 0

问题

云服务器 ECS Linux 下 TCP/UDP 端口测试及验证方法是什么

boxti 2019-12-01 22:00:40 2566 浏览量 回答数 0

回答

本文为您介绍资源编排服务(ROS)支持的ECS实例云助手功能。 前提条件 进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册。 背景信息 ROS新增以下两种资源类型,支持ECS实例云助手功能: ALIYUN::ECS::Command (用于创建云助手命令) ALIYUN::ECS::Invocation (用于执行云助手命令) 通过以上ROS资源类型,您可以便捷的创建脚本,对运行中的一台或多台实例执行bat/PowerShell(Windows 实例)脚本或者Shell脚本(Linux 实例)。您也可以设置命令的执行周期,使实例维持在某种状态、获取实例监控以及日志信息或者守护进程等。云助手概述不会主动发起任何操作,所有的操作都在您的可控范围内。 创建云助手命令 下例为您介绍如何通过ROS模板创建云助手命令。 { "ROSTemplateFormatVersion" : "2015-09-01", "Resources" : { "MyCommand": { "Type": "ALIYUN::ECS::Command", "Properties": { 'Name': 'my-command', 'Type': 'RunShellScript', 'Description': 'my-command-description', 'CommandContent': 'ZWNobyAxMjM=' } } }, "Outputs": { "CommandId": { "Value" : {"Fn::GetAtt": ["MyCommand", "CommandId"]} } } } 在本例中,Type(资源类型)设置为ALIYUN::ECS::Command。Properties的设置如下: Name表示命令名称。此处设置为my-command。 Type表示命令类型。此处设置为RunShellScript。 Description表示命令描述。此处设置为my-command-description。 CommandContent表示命令脚本Base64编码后的内容,大小不能超过16KB。此处设置为ZWNobyAxMjM=(echo 123 Base64 encoded)。 最后,通过Outputs标签返回新建命令的CommandId。 说明 目前,云助手支持以下三种脚本: Windows实例适用的Bat脚本(RunBatScript) Windows实例适用的PowerShell脚本(RunPowerShellScript) Linux实例适用的Shell脚本(RunShellScript) 执行云助手命令 下例为您介绍如何通过ROS模板执行云助手命令。 { "ROSTemplateFormatVersion" : "2015-09-01", "Resources" : { "MyCommand": { "Type": "ALIYUN::ECS::Command", "Properties": { 'Name': 'my-command', 'Type': 'RunShellScript', 'Description': 'my-command-description', 'CommandContent': 'ZWNobyAxMjM=' } }, "MyInvocation": { "Type": "ALIYUN::ECS::Invocation", "Properties": { 'CommandId': { "Fn::GetAtt" : [ "MyCommand", "CommandId" ] }, 'InstanceIds': [ "i-2zefq1f3ynnrr89qkzg9" ], 'Timed': true, 'Frequency': '0/10 0/1 * * * ?' } } }, "Outputs": { "CommandId": { "Value" : {"Fn::GetAtt": ["MyCommand", "CommandId"]} }, "InvokeId": { "Value" : {"Fn::GetAtt": ["MyInvocation", "InvokeId"]} } } } 在本例中,Type(资源类型)设置为ALIYUN::ECS::Invocation。Properties的设置如下: CommandId表示命令ID。此处使用Fn::GetAtt方法从MyCommand中获取CommandId。 InstanceIds表示命令执行的实例ID列表。最多支持20台实例。实例需要为专有网络运行中的实例。 Timed表示命令是否周期执行。 Frequency表示命令执行周期。该参数取值遵循Cron表达式。详情请参见Cron表达式。 最后,通过Outputs标签返回新建命令的CommandId和InvokeId。 创建云助手资源栈 登录资源编排控制台。 在左侧导航栏,单击资源栈管理。 在右上角区域,单击新建资源栈。 在选择地域(region)列表,选择您即将创建的资源的所属地域。 在模板源列表,选择直接输入。 填写模板数据。代码如下。 { "ROSTemplateFormatVersion" : "2015-09-01", "Resources" : { "MyCommand": { "Type": "ALIYUN::ECS::Command", "Properties": { 'Name': 'my-command', 'Type': 'RunShellScript', 'Description': 'my-command-description', 'CommandContent': 'ZWNobyAxMjM=' } } }, "Outputs": { "CommandId": { "Value" : {"Fn::GetAtt": ["MyCommand", "CommandId"]} } } } 单击下一步。 在资源栈配置页面,填写栈名和创建超时(分钟)的分钟数。 单击创建。

1934890530796658 2020-03-24 18:25:56 0 浏览量 回答数 0

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

回答

本文总结了常见的 Linux 内核参数及相关问题。修改内核参数前,您需要: 从实际需要出发,最好有相关数据的支撑,若您的业务没有受到影响不建议调整内核参数。 了解每一个参数的具体作用,并且同类型或版本操作系统下内核参数可能有所不同。 备份 ECS 实例中的重要数据。参阅文档 创建快照。 Linux 常用内核网络参数 参数 描述 net.core.rmem_default 默认的 TCP 数据接收窗口大小(字节)。 net.core.rmem_max 最大的 TCP 数据接收窗口(字节)。 net.core.wmem_default 默认的 TCP 数据发送窗口大小(字节)。 net.core.wmem_max 最大的 TCP 数据发送窗口(字节)。 net.core.netdev_max_backlog 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.core.somaxconn 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。 net.core.optmem_max 表示每个套接字所允许的最大缓冲区的大小。 net.ipv4.tcp_mem 确定 TCP 栈应该如何反映内存使用,每个值的单位都是内存页(通常是 4KB)第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(注意:其单位是内存页而不是字节)。 net.ipv4.tcp_rmem 为自动调优定义 socket 使用的内存。第一个值是为 socket 接收缓冲区分配的最少字节数;第二个值是默认值(该值会被 rmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被 rmem_max 覆盖)。 net.ipv4.tcp_wmem 为自动调优定义 socket 使用的内存。第一个值是为 socket 发送缓冲区分配的最少字节数;第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。 net.ipv4.tcp_keepalive_time TCP 发送 keepalive 探测消息的间隔时间(秒),用于确认 TCP 连接是否有效。 net.ipv4.tcp_keepalive_intvl 探测消息未获得响应时,重发该消息的间隔时间(秒)。 net.ipv4.tcp_keepalive_probes 在认定 TCP 连接失效之前,最多发送多少个 keepalive 探测消息。 net.ipv4.tcp_sack 启用有选择的应答(1 表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对 CPU 的占用。 net.ipv4.tcp_fack 启用转发应答,可以进行有选择应答(SACK)从而减少拥塞情况的发生,这个选项也应该启用。 net.ipv4.tcp_timestamps TCP 时间戳(会在 TCP 包头增加 12 B),以一种比重发超时更精确的方法(参考 RFC 1323)来启用对 RTT 的计算,为实现更好的性能应该启用这个选项。 net.ipv4.tcp_window_scaling 启用 RFC 1323 定义的 window scaling,要支持超过 64KB 的 TCP 窗口,必须启用该值(1 表示启用),TCP 窗口最大至 1GB,TCP 连接双方都启用时才生效。 net.ipv4.tcp_syncookies 表示是否打开 TCP 同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES 项进行编译,同步标签可以防止一个套接字在有过多试图连接到达时引起过载。默认值 0 表示关闭。 net.ipv4.tcp_tw_reuse 表示是否允许将处于 TIME-WAIT 状态的 socket (TIME-WAIT 的端口)用于新的 TCP 连接。 net.ipv4.tcp_tw_recycle 能够更快地回收 TIME-WAIT 套接字。 net.ipv4.tcp_fin_timeout 对于本端断开的 socket 连接,TCP 保持在 FIN-WAIT-2 状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。 net.ipv4.ip_local_port_range 表示 TCP/UDP 协议允许使用的本地端口号。 net.ipv4.tcp_max_syn_backlog 对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字。默认为 1024。 net.ipv4.tcp_low_latency 允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况,这个选项应该禁用。 net.ipv4.tcp_westwood 启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化,对于 WAN 通信来说应该启用这个选项。 net.ipv4.tcp_bic 为快速长距离网络启用 Binary Increase Congestion,这样可以更好地利用以 GB 速度进行操作的链接,对于 WAN 通信应该启用这个选项。 net.ipv4.tcp_max_tw_buckets 该参数设置系统的 TIME_WAIT 的数量,如果超过默认值则会被立即清除。默认为 180000。 net.ipv4.tcp_synack_retries 指明了处于 SYN_RECV 状态时重传 SYN+ACK 包的次数。 net.ipv4.tcp_abort_on_overflow 设置改参数为 1 时,当系统在短时间内收到了大量的请求,而相关的应用程序未能处理时,就会发送 Reset 包直接终止这些链接。建议通过优化应用程序的效率来提高处理能力,而不是简单地 Reset。默认值: 0 net.ipv4.route.max_size 内核所允许的最大路由数目。 net.ipv4.ip_forward 接口间转发报文。 net.ipv4.ip_default_ttl 报文可以经过的最大跳数。 net.netfilter.nf_conntrack_tcp_timeout_established 让 iptables 对于已建立的连接,在设置时间内若没有活动,那么则清除掉。 net.netfilter.nf_conntrack_max 哈希表项最大值。 查看和修改 Linux 实例内核参数 方法一、通过 /proc/sys/ 目录 /proc/sys/ 目录是 Linux 内核在启动后生成的伪目录,其目录下的 net 文件夹中存放了当前系统中生效的所有内核参数、目录树结构与参数的完整名称相关,如 net.ipv4.tcp_tw_recycle,它对应的文件是 /proc/sys/net/ipv4/tcp_tw_recycle,文件的内容就是参数值。 查看内核参数:使用 cat 查看对应文件的内容,例如执行命令 cat /proc/sys/net/ipv4/tcp_tw_recycle 查看 net.ipv4.tcp_tw_recycle 的值。 修改内核参数:使用 echo 修改内核参数对应的文件,例如执行命令 echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle 将 net.ipv4.tcp_tw_recycle 的值修改为 0。 注意:方法一修改的参数值仅在当次运行中生效,系统重启后会回滚历史值,一般用于临时性的验证修改的效果。若需要永久性的修改,请参阅方法二。 方法二、通过 sysctl.conf 文件 查看内核参数:执行命令 sysctl -a 查看当前系统中生效的所有参数,如下所示: net.ipv4.tcp_app_win = 31 net.ipv4.tcp_adv_win_scale = 2 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_frto = 2 net.ipv4.tcp_frto_response = 0 net.ipv4.tcp_low_latency = 0 net.ipv4.tcp_no_metrics_save = 0 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_tso_win_divisor = 3 net.ipv4.tcp_congestion_control = cubic net.ipv4.tcp_abc = 0 net.ipv4.tcp_mtu_probing = 0 net.ipv4.tcp_base_mss = 512 net.ipv4.tcp_workaround_signed_windows = 0 net.ipv4.tcp_challenge_ack_limit = 1000 net.ipv4.tcp_limit_output_bytes = 262144 net.ipv4.tcp_dma_copybreak = 4096 net.ipv4.tcp_slow_start_after_idle = 1 net.ipv4.cipso_cache_enable = 1 net.ipv4.cipso_cache_bucket_size = 10 net.ipv4.cipso_rbm_optfmt = 0 net.ipv4.cipso_rbm_strictvalid = 1 修改内核参数: 执行命令   /sbin/sysctl -w kernel.domainname="example.com"  来修改指定的参数值,如 sysctl -w net.ipv4.tcp_tw_recycle="0" 执行命令   vi /etc/sysctl.conf  修改   /etc/sysctl.conf  文件中的参数。 执行命令   /sbin/sysctl -p  使配置生效。 Linux 网络相关内核参数引发的常见问题及处理 问题现象 原因分析 解决方案 无法在本地网络环境通过 SSH 连接 ECS Linux 实例,或者访问该 Linux 实例上的 HTTP 业务出现异常。Telnet 测试会被 reset。 如果您的本地网络是 NAT 共享方式上网,该问题可能是由于本地 NAT 环境和目标 Linux 相关内核参数配置不匹配导致。尝试通过修改目标 Linux 实例内核参数来解决问题:1. 远程连接目标 Linux 实例;2. 查看当前配置: cat /proc/sys/net/ipv4/tcp_tw_recyclecat /proc/sys/net/ipv4/tcp_timestamps 查看上述两个配置的值是不是 0,如果为 1的话,NAT 环境下的请求可能会导致上述问题。 通过如下方式将上述参数值修改为 0:1. 执行命令 vi /etc/sysctl.conf。2. 添加如下内容:net.ipv4.tcp_tw_recycle=0net.ipv4.tcp_timestamps=0。3. 输入指令 # sysctl -p 使配置生效。4. 重新 SSH 登录实例或者业务访问测试。 服务端 A 与 客户端 B 建立了 TCP 连接,之后服务端 A 主动断开了连接,但是在客户端 B 上仍然看到连接是建立的。示例见图一,图二。 通常是由于修改了服务端内核参数 net.ipv4.tcp_fin_timeout 默认设置所致。 1. 执行命令 vi /etc/sysctl.conf,修改配置:net.ipv4.tcp_fin_timeout=30。2. 执行命令 # sysctl -p 使配置生效。 通过 netstat 或 ss 可以看到大量处于 TIME_WAIT 状态的连接。 通过 netstat -n | awk ‘/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}’ 查看 TIME_WAIT 数量。 1. 执行命令 vi /etc/sysctl.conf,修改或加入以下内容: net . ipv4 . tcp_syncookies = 1 net . ipv4 . tcp_tw_reuse = 1 net . ipv4 . tcp_tw_recycle = 1 net . ipv4 . tcp_fin_timeout = 30 2. 执行命令 /sbin/sysctl -p  使配置生效。 云服务器上出现大量 CLOSE_WAIT 状态的连接数。 根据实例上的业务量来判断 CLOSE_WAIT 数量是否超出了正常的范围。TCP 连接断开时需要进行四次挥手,TCP 连接的两端都可以发起关闭连接的请求,若对端发起了关闭连接,但本地没有进行后续的关闭连接操作,那么该链接就会处于 CLOSE_WAIT 状态。虽然该链接已经处于半开状态,但是已经无法和对端通信,需要及时的释放该链接。建议从业务层面及时判断某个连接是否已经被对端关闭,即在程序逻辑中对连接及时进行关闭检查。 通过命令 netstat -an|grep CLOSE_WAIT|wc -l 查看当前实例上处于 CLOSE_WAIT 状态的连接数。Java 语言:1. 通过 read 方法来判断 I/O 。当 read 方法返回 -1 时则表示已经到达末尾。2. 通过 close 方法关闭该链接。C 语言:1. 检查 read 的返回值,若是 0 则可以关闭该连接,若小于 0 则查看一下 errno,若不是 AGAIN 则同样可以关闭连接。 ECS Linux FIN_WAIT2 状态的 TCP 链接过多。 HTTP 服务中,SERVER 由于某种原因关闭连接,如 KEEPALIVE 的超时。这样,作为主动关闭的 SERVER 一方就会进入 FIN_WAIT2 状态。但 TCP/IP 协议栈中,FIN_WAIT2 状态是没有超时的(不像 TIME_WAIT 状态),如果 Client 不关闭,FIN_WAIT_2 状态将保持到系统重启,越来越多的 FIN_WAIT_2 状态会致使内核 Crash。 1. 执行命令 vi /etc/sysctl.conf,修改或加入以下内容: net . ipv4 . tcp_syncookies = 1 net . ipv4 . tcp_fin_timeout = 30 net . ipv4 . tcp_max_syn_backlog = 8192 net . ipv4 . tcp_max_tw_buckets = 5000 2. 执行命令 # sysctl -p 使配置生效。 查询服务器 /var/log/message 日志,发现全部是类似如下 kernel: TCP: time wait bucket table overflowt 的报错信息,报错提示 TCP time wait 溢出,见图三。 TCP 连接使用很高,容易超出限制。见图四。 1. 执行命令 netstat -anp |grep tcp |wc -l统计 TCP 连接数。2. 对比 /etc/sysctl.conf 配置文件的 net.ipv4.tcp_max_tw_buckets 最大值,看是否有超出情况。3. 执行命令 vi /etc/sysctl.conf,查询 net.ipv4.tcp_max_tw_buckets 参数。如果确认连接使用很高,容易超出限制。4. 调高参数 net.ipv4.tcp_max_tw_buckets,扩大限制。5. 执行命令 # sysctl -p 使配置生效。 ECS Linux 实例出现间歇性丢包的情况,通过 tracert, mtr 等手段排查,外部网络未见异常。同时,如下图所示,在系统日志中重复出现大量kernel nf_conntrack: table full, dropping packet.错误信息。见图五。 ip_conntrack 是 Linux 系统内 NAT 的一个跟踪连接条目的模块。ip_conntrack 模块会使用一个哈希表记录 TCP 通讯协议的 established connection 记录,当哈希表满了的时候,会导致 nf_conntrack: table full, dropping packet 错误。需要通过修改内核参数来调整 ip_conntrack 限制。 Centos 5.x 系统1. 使用管理终端登录实例。2. 执行命令 # vi /etc/sysctl.conf 编辑系统内核配置。3. 修改哈希表项最大值参数:net.ipv4.netfilter.ip_conntrack_max = 655350。4. 修改超时时间参数:net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1200,默认情况下 timeout 是5天(432000秒)。5. 执行命令 # sysctl -p 使配置生效。Centos 6.x 及以上系统:1. 使用管理终端登录实例。2. 执行命令 # vi /etc/sysctl.conf 编辑系统内核配置。3. 修改哈希表项最大值参数:net.netfilter.nf_conntrack_max = 655350。4. 修改超时时间参数:net.netfilter.nf_conntrack_tcp_timeout_established = 1200,默认情况下 timeout 是5天(432000秒)。5. 执行命令 # sysctl -p 使配置生效。 客户端做了 NAT 后无法访问 ECS、RDS,包括通过 SNAT VPC 访问外网的 ECS 。无法访问连接其他 ECS 或 RDS 等云产品,抓包检测发现远端对客户端发送的 SYN 包没有响应。 若远端服务器同时开启 net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_timestamps,即参数取值为 1 时,服务器会检查每一个报文的时间戳(Timestamp),若 Timestamp 不是递增的关系,则不做处理。做了 NAT 后,服务器看到来自不同的客户端的 IP 相似,但 NAT 前每一台客户端的时间可能会有偏差,在服务器上就会看到 Timestamp 不是递增的情况。 - 远端服务器为 ECS:修改参数 net.ipv4.tcp_tw_recycle 为 0。- 远端服务器为 RDS 等 PaaS 服务:RDS 无法直接修改内核参数,需要在客户端上修改参数 net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_timestamps 为 0。 参考链接 Linux man-pages kernel/git/torvalds/linux.git_proc kernel/git/torvalds/linux.git_proc_net_tcp kernel/git/torvalds/linux.git_ip-sysctl kernel/git/torvalds/linux.git_netfilter-sysctl kernel/git/torvalds/linux.git_nf_conntrack-sysctl 图一: 客户端 B TCP 连接 图二: 客户端 A TCP 连接 图三: 报错提示 TCP time wait 溢出 图四: 查询 net.ipv4.tcp_max_tw_buckets 参数 图五: ECS Linux 实例间歇性丢包

KB小秘书 2019-12-02 02:05:57 0 浏览量 回答数 0

回答

一、内存溢出类型 1、java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况) set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 2、java.lang.OutOfMemoryError: Java heap space 第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。 注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。 垃圾回收GC的角色 JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收: 当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。 根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。 为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收, 一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。 二、JVM内存区域组成 简单的说java中的堆和栈 java把内存分两种:一种是栈内存,另一种是堆内存 1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配; 2。堆内存用来存放由new创建的对象和数组 在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理 堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢; 栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。 java堆分为三个区:New、Old和Permanent GC有两个线程: 新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn java栈存放 栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间 每个线程都有他自己的Stack 三、JVM如何设置虚拟内存 提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。 简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制, 这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了 提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。 提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64; 由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 解决方法:手动设置Heap size 修改TOMCAT_HOME/bin/catalina.bat 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 四、性能检查工具使用 定位内存泄漏: JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。 1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位; 2. 应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次; 3. 应用服务器经常做Full GC(Garbage Collection),而且时间很长,大约需要30-40秒,应用服务器在做Full GC的时候是不响应客户的交易请求的,非常影响系统性能。 因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory,这时应继续跟踪看接下来是否会有下降, 如果一直居高不下这肯定就因为程序的原因导致内存泄漏。 五、不健壮代码的特征及解决办法 1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。 对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率; 2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域; String str = "aaa"; String str2 = "bbb"; String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销; 3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的; 4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。 这是一个案例想定供大家警戒 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误, 检查之后发现问题:组件里的代码 m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes]; 问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。 5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。 6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃 7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!

牧明 2019-12-02 02:16:21 0 浏览量 回答数 0

问题

什么是Linux 实例常用内核网络参数介绍与常见问题处理

boxti 2019-12-01 22:01:36 2069 浏览量 回答数 0

问题

开发者论坛一周精粹(第四十三期) 物联网全栈教程 ECSphp版本降级

福利达人 2019-12-01 22:06:51 4936 浏览量 回答数 0

回答

本页目录 步骤一:安装Beego 步骤二:创建应用 步骤三:打包应用 步骤四:创建应用并完成部署 常见问题 更多信息 Beego是一个快速开发Go应用的HTTP框架,可以用来快速开发API、Web、后端服务等各种应用。本文档介绍了如何开发一个简单的Beego应用,并将其部署至Web+。 步骤一:安装Beego 执行以下命令来安装Beego和工具bee。 go get -u github.com/astaxie/beego go get -u github.com/beego/bee 执行以下命令将$GOPATH/bin目录加入$PATH环境变量。 echo 'export PATH="$GOPATH/bin:$PATH"' >> ~/.profile source >> ~/.profile 步骤二:创建应用 打开终端,进入$GOPATH/src所在的目录,执行以下命令来快速创建一个命名为webplusdemo的项目。 bee new webplusdemo 上述命令会创建一个名为webplusdemo的目录,结构如下: webplusdemo ├── conf │ └── app.conf ├── controllers │ └── default.go ├── main.go ├── models ├── routers │ └── router.go ├── static │ ├── css │ ├── img │ └── js │ └── reload.min.js ├── tests │ └── default_test.go └── views └── index.tpl 进入项目目录,执行bee run。 打开浏览器,输入http://localhost:8080来访问项目。 步骤三:打包应用 在项目目录下新建Procfile来给Go应用指定启动命令,填写以下内容,并保存。 web: chmod +x webplusdemo; ./webplusdemo 使用bee工具来对打包工程。 bee pack -be GOOS=linux -be GOARCH=amd64 -f zip 执行完上述命令,将会在项目目录下生成一个名为webplusdemo.zip的压缩包,按照下述步骤来将该Go应用部署至Web+。 步骤四:创建应用并完成部署 登录 Web+控制台,并在页面左上角选择所需地域。 在概览页最近更新的部署环境区域的右上角单击新建。 在应用基本信息页面选择技术栈类型为Go,设置应用基本信息,设置完成后单击下一步。 在部署环境信息页面设置部署环境名称,部署包来源选择上传本地程序,上传您刚打包的webplusdemo.zip,设置部署包版本后单击完成创建。 在完成创建页面单击查看该应用或完成创建可进入应用详情页面。单击部署环境名称进入部署环境详情页面,然后单击公网访问地址右侧的链接进入应用首页。 常见问题 健康检查失败导致网站无法访问怎么办? 如果使用SLB,请在健康检查URL的controller中接受head请求,否则可能会导致健康检查失败,网站无法访问。 package controllers import ( "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (c *MainController) Get() { c.Data["Website"] = "beego.me" c.Data["Email"] = "astaxie@gmail.com" c.TplName = "index.tpl" } func (c *MainController) Head() { c.Ctx.Output.Body([]byte("")) } 更多信息 在Web+控制台快速部署应用的视频演示请参见在Web+控制台创建应用和部署环境。 在控制台部署应用的详细配置步骤请参见部署应用。 使用CLI完成应用创建和部署的操作请参见在CLI快速部署应用。 完成应用托管之后的应用的管理操作请参见应用详情概览。 管理应用所在的部署环境的操作请参见部署环境概览。

1934890530796658 2020-03-23 14:23:04 0 浏览量 回答数 0

问题

技术原理

行者武松 2019-12-01 21:43:50 2231 浏览量 回答数 0

回答

我们都知道JVM的内存管理是自动化的,Java语言的程序指针也不需要开发人员手工释放,JVM的GC会自动的进行回收,但是,如果编程不当,JVM仍然会发生内存泄露,导致Java程序产生了OutOfMemoryError(OOM)错误。 产生OutOfMemoryError错误的原因包括: java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: PermGen space及其解决方法java.lang.OutOfMemoryError: unable to create new native threadjava.lang.OutOfMemoryError:GC overhead limit exceeded对于第1种异常,表示Java堆空间不够,当应用程序申请更多的内存,而Java堆内存已经无法满足应用程序对内存的需要,将抛出这种异常。 对于第2种异常,表示Java永久带(方法区)空间不够,永久带用于存放类的字节码和长常量池,类的字节码加载后存放在这个区域,这和存放对象实例的堆区是不同的,大多数JVM的实现都不会对永久带进行垃圾回收,因此,只要类加载的过多就会出现这个问题。一般的应用程序都不会产生这个错误,然而,对于Web服务器来讲,会产生有大量的JSP,JSP在运行时被动态的编译成Java Servlet类,然后加载到方法区,因此,太多的JSP的Web工程可能产生这个异常。 对于第3种异常,本质原因是创建了太多的线程,而能创建的线程数是有限制的,导致了这种异常的发生。 对于第4种异常,是在并行或者并发回收器在GC回收时间过长、超过98%的时间用来做GC并且回收了不到2%的堆内存,然后抛出这种异常进行提前预警,用来避免内存过小造成应用不能正常工作。 下面两个异常与OOM有关系,但是,又没有绝对关系。 java.lang.StackOverflowError ...java.net.SocketException: Too many open files对于第1种异常,是JVM的线程由于递归或者方法调用层次太多,占满了线程堆栈而导致的,线程堆栈默认大小为1M。 对于第2种异常,是由于系统对文件句柄的使用是有限制的,而某个应用程序使用的文件句柄超过了这个限制,就会导致这个问题。 上面介绍了OOM相关的基础知识,接下来我们开始讲述笔者经历的一次OOM问题的定位和解决的过程。 产生问题的现象 在某一段时间内,我们发现不同的业务服务开始偶发的报OOM的异常,有的时候是白天发生,有的时候是晚上发生,有的时候是基础服务A发生,有的时候是上层服务B发生,有的时候是上层服务C发生,有的时候是下层服务D发生,丝毫看不到一点规律。 产生问题的异常如下: Caused by: java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:597)at java.util.Timer.(Timer.java:154) 解决问题的思路和过程 经过细心观察发现,产生问题虽然在不同的时间发生在不同的服务池,但是,晚上0点发生的时候概率较大,也有其他时间偶发,但是都在整点。 这个规律很重要,虽然不是一个时间,但是基本都在整点左右发生,并且晚上0点居多。从这个角度思考,整点或者0点系统是否有定时,与出问题的每个业务系统技术负责人核实,0点没有定时任务,其他时间的整点有定时任务,但是与发生问题的时间不吻合,这个思路行不通。 到现在为止,从现象的规律上我们已经没法继续分析下去了,那我们回顾一下错误本身: java.lang.OutOfMemoryError: unable to create new native thread 顾名思义,错误产生的原因就是应用不能创建线程了,但是,应用还需要创建线程。为什么程序不能创建线程呢? 有两个具体原因造成这个异常: 由于线程使用的资源过多,操作系统已经不能再提供给应用资源了。操作系统设置了应用创建线程的最大数量,并且已经达到了最大允许数量。上面第1条资源指的是内存,而第2条中,在Linux下线程使用轻量级进程实现的,因此线程的最大数量也是操作系统允许的进程的最大数量。 内存计算 操作系统中的最大可用内存除去操作系统本身使用的部分,剩下的都可以为某一个进程服务,在JVM进程中,内存又被分为堆、本地内存和栈等三大块,Java堆是JVM自动管理的内存,应用的对象的创建和销毁、类的装载等都发生在这里,本地内存是Java应用使用的一种特殊内存,JVM并不直接管理其生命周期,每个线程也会有一个栈,是用来存储线程工作过程中产生的方法局部变量、方法参数和返回值的,每个线程对应的栈的默认大小为1M。 Linux和JVM的内存管理示意图如下: 内存结构模型因此,从内存角度来看创建线程需要内存空间,如果JVM进程正当一个应用创建线程,而操作系统没有剩余的内存分配给此JVM进程,则会抛出问题中的OOM异常:unable to create new native thread。 如下公式可以用来从内存角度计算允许创建的最大线程数: 最大线程数 = (操作系统最大可用内存 - JVM内存 - 操作系统预留内存)/ 线程栈大小 根据这个公式,我们可以通过剩余内存计算可以创建线程的数量。 下面是问题出现的时候,从生产机器上执行前面小节介绍的Linux命令free的输出: free -m >> /tmp/free.log total used free shared buffers cached Mem: 7872 7163 709 0 31 3807-/+ buffers/cache: 3324 4547Swap: 4095 173 3922Tue Jul 5 00:27:51 CST 2016从上面输出可以得出,生产机器8G内存,使用了7G,剩余700M可用,其中操作系统cache使用3.8G。操作系统cache使用的3.8G是用来缓存IO数据的,如果进程内存不够用,这些内存是可以释放出来优先分配给进程使用。然而,我们暂时并不需要考虑这块内存,剩余的700M空间完全可以继续用来创建线程数: 700M / 1M = 700个线程 因此,根据内存可用计算,当OOM异常:unable to create new native thread问题发生的时候,还有700M可用内存,可以创建700个线程。 到现在为止可以证明此次OOM异常不是因为线程吃光所有的内存而导致的。 线程数对比 上面提到,有两个具体原因造成这个异常,我们上面已经排除了第1个原因,那我们现在从第2个原因入手,评估是否操作系统设置了应用创建线程的最大数量,并且已经达到了最大允许数量。 在问题出现的生产机器上使用ulimit -a来显示当前的各种系统对用户使用资源的限制: robert@robert-ubuntu1410:~$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 62819max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 65535pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 1024virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited这里面我们看到生产机器设置的允许使用的最大用户进程数为1024: max user processes (-u) 1024现在,我们必须获得问题出现的时候,用户下创建的线程情况。 在问题产生的时候,我们使用前面小结介绍的JVM监控命令jstack命令打印出了Java线程情况,jstack命令的示例输出如下: robert@robert-ubuntu1410:~$ jstack 27432017-04-09 12:06:51Full thread dump Java HotSpot(TM) Server VM (25.20-b23 mixed mode): "Attach Listener" #23 daemon prio=9 os_prio=0 tid=0xc09adc00 nid=0xb4c waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "http-nio-8080-Acceptor-0" #22 daemon prio=5 os_prio=0 tid=0xc3341000 nid=0xb02 runnable [0xbf1bd000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:241) - locked <0xcf8938d8> (a java.lang.Object) at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:688) at java.lang.Thread.run(Thread.java:745) "http-nio-8080-ClientPoller-1" #21 daemon prio=5 os_prio=0 tid=0xc35bc400 nid=0xb01 runnable [0xbf1fe000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <0xcf99b100> (a sun.nio.ch.Util$2) - locked <0xcf99b0f0> (a java.util.Collections$UnmodifiableSet) - locked <0xcf99aff8> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:1052) at java.lang.Thread.run(Thread.java:745) ......从jstack命令的输出并统计后,我们得知,JVM一共创建了904个线程,但是,这还没有到最大的进程限制1024。 robert@robert-ubuntu1410:~$ grep "Thread " js.log | wc -l 904 这是我们思考,除了JVM创建的应用层线程,JVM本身可能会有一些管理线程存在,而且操作系统内用户下可能也会有守护线程在运行。 我们继续从操作系统的角度来统计线程数,我们使用上面小结介绍的Linux操作系统命令pstack,并得到如下的输出: PID LWP USER %CPU %MEM CMD 1 1 root 0.0 0.0 /sbin/init 2 2 root 0.0 0.0 [kthreadd] 3 3 root 0.0 0.0 [migration/0] 4 4 root 0.0 0.0 [ksoftirqd/0] 5 5 root 0.0 0.0 [migration/0] 6 6 root 0.0 0.0 [watchdog/0] 7 7 root 0.0 0.0 [migration/1] 8 8 root 0.0 0.0 [migration/1] 9 9 root 0.0 0.0 [ksoftirqd/1] 10 10 root 0.0 0.0 [watchdog/1] 11 11 root 0.0 0.0 [migration/2] 12 12 root 0.0 0.0 [migration/2] 13 13 root 0.0 0.0 [ksoftirqd/2] 14 14 root 0.0 0.0 [watchdog/2] 15 15 root 0.0 0.0 [migration/3] 16 16 root 0.0 0.0 [migration/3] 17 17 root 0.0 0.0 [ksoftirqd/3] 18 18 root 0.0 0.0 [watchdog/3] 19 19 root 0.0 0.0 [events/0] 20 20 root 0.0 0.0 [events/1] 21 21 root 0.0 0.0 [events/2] 22 22 root 0.0 0.0 [events/3] 23 23 root 0.0 0.0 [cgroup] 24 24 root 0.0 0.0 [khelper] ...... 7257 7257 zabbix 0.0 0.0 /usr/local/zabbix/sbin/zabbix_agentd: active checks #2 [idle 1 sec] 7258 7258 zabbix 0.0 0.0 /usr/local/zabbix/sbin/zabbix_agentd: active checks #3 [idle 1 sec] 7259 7259 zabbix 0.0 0.0 /usr/local/zabbix/sbin/zabbix_agentd: active checks #4 [idle 1 sec] ...... 9040 9040 app 0.0 30.5 /apps/prod/jdk1.6.0_24/bin/java -Dnop -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Ddbconfigpath=/apps/dbconfig/ -Djava.io.tmpdir=/apps/data/java-tmpdir -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.10.194 -Dcom.sun.management.jmxremote.port=6969 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Xshare:off -Dhostname=sjsa-trade04 -Djute.maxbuffer=41943040 -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8 -Dworkdir=/apps/data/tomcat-work -Djava.endorsed.dirs=/apps/product/tomcat-trade/endorsed -classpath commonlib:/apps/product/tomcat-trade/bin/bootstrap.jar:/apps/product/tomcat-trade/bin/tomcat-juli.jar -Dcatalina.base=/apps/product/tomcat-trade -Dcatalina.home=/apps/product/tomcat-trade -Djava.io.tmpdir=/apps/data/tomcat-temp/ org.apache.catalina.startup.Bootstrap start 9040 9041 app 0.0 30.5 /apps/prod/jdk1.6.0_24/bin/java -Dnop -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Ddbconfigpath=/apps/dbconfig/ -Djava.io.tmpdir=/apps/data/java-tmpdir -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.10.194 -Dcom.sun.management.jmxremote.port=6969 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Xshare:off -Dhostname=sjsa-trade04 -Djute.maxbuffer=41943040 -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8 -Dworkdir=/apps/data/tomcat-work -Djava.endorsed.dirs=/apps/product/tomcat-trade/endorsed -classpath commonlib:/apps/product/tomcat-trade/bin/bootstrap.jar:/apps/product/tomcat-trade/bin/tomcat-juli.jar -Dcatalina.base=/apps/product/tomcat-trade -Dcatalina.home=/apps/product/tomcat-trade -Djava.io.tmpdir=/apps/data/tomcat-temp/ org.apache.catalina.startup.Bootstrap start ......通过命令统计用户下已经创建的线程数为1021。 $ grep app pthreads.log | wc -l 1021 现在我们确定,1021的数字已经相当的接近1021的最大进程数了,正如前面我们提到,在Linux操作系统里,线程是通过轻量级的进程实现的,因此,限制用户的最大进程数,就是限制用户的最大线程数,至于为什么没有精确达到1024这个最大值就已经报出异常,应该是系统的自我保护功能,在还剩下3个线程的前提下,就开始报错。 到此为止,我们已经通过分析来找到问题的原因,但是,我们还是不知道为什么会创建这么多的线程,从第一个输出得知,JVM已经创建的应用线程有907个,那么他们都在做什么事情呢? 于是,在问题发生的时候,我们又使用JVM的jstack命令,查看输出得知,每个线程都阻塞在打印日志的语句上,log4j中打印日志的代码实现如下: public void callAppenders(LoggingEvent event) { int writes = 0; for(Category c = this; c != null; c=c.parent) { // Protected against simultaneous call to addAppender, removeAppender,... synchronized(c) { if(c.aai != null) { writes += c.aai.appendLoopOnAppenders(event); } if(!c.additive) { break; } } } if(writes == 0) { repository.emitNoAppenderWarning(this); } }在log4j中,打印日志有一个锁,锁的作用是让打印日志可以串行,保证日志在日志文件中的正确性和顺序性。 那么,新的问题又来了,为什么只有凌晨0点会出现打印日志阻塞,其他时间会偶尔发生呢?这时,我们带着新的线索又回到问题开始的思路,凌晨12点应用没有定时任务,系统会不会有其他的IO密集型的任务,比如说归档日志、磁盘备份等? 经过与运维部门碰头,基本确定是每天凌晨0点日志切割导致磁盘IO被占用,于是堵塞打印日志,日志是每个工作任务都必须的,日志阻塞,线程池就阻塞,线程池阻塞就导致线程池被撑大,线程池里面的线程数超过1024就会报错。 到这里,我们基本确定了问题的原因,但是还需要对日志切割导致IO增大进行分析和论证。 首先我们使用前面小结介绍的vmstat查看问题发生时IO等待数据: vmstat 2 1 >> /tmp/vm.logprocs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 177608 725636 31856 3899144 0 0 2 10 0 0 39 1 1 59 0 Tue Jul 5 00:27:51 CST 2016可见,问题发生的时候,CPU的IO等待为59%,同时又与运维部门同事复盘,运维同事确认,脚本切割通过cat命令方法,先把日志文件cat后,通过管道打印到另外一个文件,再清空原文件,因此,一定会导致IO的上升。 其实,问题的过程中,还有一个疑惑,我们认为线程被IO阻塞,线程池被撑开,导致线程增多,于是,我们查看了一下Tomcat线程池的设置,我们发现Tomcat线程池设置了800,按理说,永远不会超过1024。 maxThreads="800" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> 关键在于,笔者所在的支付平台服务化架构中,使用了两套服务化框架,一个是基于dubbo的框架,一个是点对点的RPC,用来紧急情况下dubbo服务出现问题,服务降级使用。 每个服务都配置了点对点的RPC服务,并且独享一个线程池: maxThreads="800" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> 由于我们在对dubbo服务框架进行定制化的时候,设计了自动降级原则,如果dubbo服务负载变高,会自动切换到点对点的RPC框架,这也符合微服务的失效转移原则,但是设计中没有进行全面的考虑,一旦一部分服务切换到了点对点的RPC,而一部分的服务没有切换,就导致两个现场池都被撑满,于是超过了1024的限制,就出了问题。 到这里,我们基本可以验证,问题的根源是日志切割导致IO负载增加,然后阻塞线程池,最后发生OOM:unable to create new native thread。 剩下的任务就是最小化重现的问题,通过实践来验证问题的原因。我们与性能压测部门沟通,提出压测需求: Tomcat线程池最大设置为1500.操作系统允许的最大用户进程数1024.在给服务加压的过程中,需要人工制造繁忙的IO操作,IO等待不得低于50%。经过压测压测部门的一下午努力,环境搞定,结果证明完全可以重现此问题。 最后,与所有相关部门讨论和复盘,应用解决方案,解决方案包括: 全部应用改成按照小时切割,或者直接使用log4j的日志滚动功能。Tomcat线程池的线程数设置与操作系统的线程数设置不合理,适当的减少Tomcat线程池线程数量的大小。升级log4j日志,使用logback或者log4j2。这次OOM问题的可以归结为“多个因、多个果、多台机器、多个服务池、不同时间”,针对这个问题,与运维部、监控部和性能压测部门的同事奋斗了几天几夜,终于通过在线上抓取信息、分析问题、在性能压测部门同事的帮助下,最小化重现问题并找到问题的根源原因,最后,针对问题产生的根源提供了有效的方案。 与监控同事现场编写的脚本 本节提供一个笔者在实践过程中解决OOM问题的一个简单脚本,这个脚本是为了解决OOM(unable to create native thread)的问题而在问题机器上临时编写,并临时使用的,脚本并没有写的很专业,笔者也没有进行优化,保持原汁原味的风格,这样能让读者有种身临其境的感觉,只是为了抓取需要的信息并解决问题,但是在线上问题十分火急的情况下,这个脚本会有大用处。 !/bin/bash ps -Leo pid,lwp,user,pcpu,pmem,cmd >> /tmp/pthreads.logecho "ps -Leo pid,lwp,user,pcpu,pmem,cmd >> /tmp/pthreads.log" >> /tmp/pthreads.logecho date >> /tmp/pthreads.logecho 1 pid=ps aux|grep tomcat|grep cwh|awk -F ' ' '{print $2}'echo 2 echo "pstack $pid >> /tmp/pstack.log" >> /tmp/pstack.logpstack $pid >> /tmp/pstack.logecho date >> /tmp/pstack.logecho 3 echo "lsof >> /tmp/sys-o-files.log" >> /tmp/sys-o-files.loglsof >> /tmp/sys-o-files.logecho date >> /tmp/sys-o-files.logecho 4 echo "lsof -p $pid >> /tmp/service-o-files.log" >> /tmp/service-o-files.loglsof -p $pid >> /tmp/service-o-files.logecho date >> /tmp/service-o-files.logecho 5 echo "jstack -l $pid >> /tmp/js.log" >> /tmp/js.logjstack -l -F $pid >> /tmp/js.logecho date >> /tmp/js.logecho 6 echo "free -m >> /tmp/free.log" >> /tmp/free.logfree -m >> /tmp/free.logecho date >> /tmp/free.logecho 7 echo "vmstat 2 1 >> /tmp/vm.log" >> /tmp/vm.logvmstat 2 1 >> /tmp/vm.logecho date >> /tmp/vm.logecho 8 echo "jmap -dump:format=b,file=/tmp/heap.hprof 2743" >> /tmp/jmap.logjmap -dump:format=b,file=/tmp/heap.hprof >> /tmp/jmap.logecho date >> /tmp/jmap.logecho 9 echo end

hiekay 2019-12-02 01:39:43 0 浏览量 回答数 0

回答

DMS for linux 6月23日更新预告,敬请期待 更新啦!更新啦!更新啦!本周(6月28号)dms for linux 将发布新版本,内容如下,尽情期待         1、命令终端支持rz文件上传命令,只要能ssh登陆,无论跳几级,都可以上传。支持目录哦,真心赞!具体包括: 文件/目录点击上传; 文件/目录拖动上传; 命令行文件上传进度;                       2、服务管理兼容centos7+的systemd协议的管理,提供更高效地服务管理模式                    3、右上角开放更直接的问题反馈入口,链接可以直达本帖,如果您在使用过程中遇到什么问题,或者对我们产品有什么诉求,欢迎轰炸我们程序员GG哦,我们会第一时间内反馈。 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 如果您第一次点入本帖,欢迎使用阿里云数据管理产品: https://dms.console.aliyun.com/#/dms/rsList 阿里云数据管理旨在一站式管理您所有云上资源 ------------------------- 回 2楼(龙吟风) 的帖子 数据管理DMS支持数据库管理、Linux管理,无需安装,易用专业,目前在云上已经有30W用户,你可以试下 https://www.aliyun.com/product/dms ------------------------- 回 6楼(大一中) 的帖子 谢谢支持,O(∩_∩)O哈哈~ ------------------------- 各位在使用dms的过程中遇到什么问题,或者有什么建议,直接在这个帖子下面提问喔 ------------------------- 回 9楼(付一二) 的帖子 您好,谢谢反馈,您说的这种是不是针对类似于apache的应用配置管理?我们目前已经正在计划深挖常用应用的管理功能包括apache,mysql等,包括配置管理,服务性能监控等,这个的确对服务的运维很有用处。我们会在后续版本加入此功能,敬请期待哦,O(∩_∩)O~。 ------------------------- 回 11楼(cokll) 的帖子        抱歉给您工作带来不便,请问这个问题只是出现在实时监控模块吗?其他模块没有报这个错么?        这个问题主要原因是您当前主机的sshd服务对单个session上的channel数量作了限制导致的。dms for linux 的实时监控模块在加载页面时需要建立多个channel执行命令,如果当前保持的channel的数量超出您主机的限制,继续建立channel就会抛出channel未打开的错误,这个配置项是/etc/ssh/sshd_config 里面的MaxSessions的配置。        我刚刚检查了一下我们的代码,发现代码中存在长时间保持单个channel的情况,导致新建channel不成功。我们代码中的bug将在下一个版本修复(约7月13号(周三))。届时请如果还有问题,请及时联系我们喔。       再次感谢您的反馈。    ------------------------- 回 11楼(cokll) 的帖子 您好,麻烦检查下您机器上的/etc/ssh/sshd_config 中是否有配置过MaxSessions这个参数,如果最大的session数被限制为1,您主机只能支持终端登陆,就用不了dms for linux的其他的功能了。 我们经过测试,能支持dms的最小的session数量为3,也就是MaxSession的值应当不小于3(默认值为10)。如果可以的话,您可以修正下这个配置然后重启下sshd服务。 如果还有问题,烦请及时反馈,谢谢亲 ------------------------- 回 15楼(山水佳) 的帖子 您好, 抱歉回复晚了,请问您是使用实时监控的查看线程栈的功能遇到这个错误的吗?实时监控模块一般不会抛出这个错,可否截一下图看看? ------------------------- 回 18楼(caesar.w.h) 的帖子 您好, 感谢您的反馈,请问您当前用的是什么浏览器?有没有在浏览器上做过某些安全性的限制? 这个问题一般是浏览器禁用了跨域请求导致我们dms控制台的登陆请求没法到达dms应用的服务器。 我们建议一般使用chrome或者火狐浏览器访问dms,如果可以的话可以换一下浏览器重新尝试下。。 如果还有问题请保持沟通过哦O(∩_∩)O~ ------------------------- 回 22楼(caesar.w.h) 的帖子 您好,抱歉回复晚了,请问是所有数据库实例都添加不了还是仅一个实例是这样? 如果仅一个实例,那么这个实例是什么类型的数据库? 如果所有实例都添加不了,有没有尝试过把浏览器卸载重装后结果还是一样?或者是,用一台新机器上的浏览器试试是否是相同的情况? 这个问题我们之前是遇到过的,主要原因是添加数据库的请求没有发送出去,还没到连接数据库那一步呢,可能是浏览器阻拦的原因,上次我们也是通过更换浏览器解决的。麻烦您按照上面的步骤再尝试下,如果还不行的话,还请保持联系噢。 感谢您对dms的支持O(∩_∩)O~ ------------------------- 回 24楼(無名塵客) 的帖子 您好,这个问题您是否已经通过工单和我们客服团队反馈过? 抱歉给您带来不便,这个问题具体原因是这样的: 您这个实例是mysql5.1版本,不支持INNODB_BUFFER_POOL_READ_REQUESTS,INNODB_BUFFER_POOL_READS这两个参数导致我们dms首页会出现500错误。目前dms支持的mysql版本是5.4之后的版本。 这个问题涉及到对老版本mysql的兼容,具体怎么改得和我们负责这一块的开发人员沟通下 ------------------------- 回 26楼(caesar.w.h) 的帖子 您好,请问用谷歌浏览器具体是什么情况?登陆会报什么错? 目前我们后台统计,使用dms的大部分是chrome用户,没有遇到类似的问题,可能是浏览器中存在某些插件原因吧。 ------------------------- 回 30楼(斯斯) 的帖子 谢谢反馈,这个问题我们已经在看,主要原因是我们现在的监控模块对部分主机的性能数据兼容性不够强,也说明我们的代码健壮性不够强。 目前我们正在查看日志寻找错误原因,预计下个发布可以修复(约下周二之前),届时麻烦线上验证下。谢谢 ------------------------- 引用第32楼ivmmff于2016-07-27 14:31发表的  : 命令终端不能粘贴命令太蛋疼 [url=https://bbs.aliyun.com/job.php?action=topost&tid=286015&pid=807524][/url] 您好,目前我们没有支持右键粘贴的功能。 您可以使用Ctrl + V、Shift + Insert 等方式进行粘贴。 后续我们会支持右键粘贴的功能,感谢您的关注。 ------------------------- 回 31楼(galphy) 的帖子 你好,目前我们没有对命令终端的操作超时做控制,正常情况下没有操作,至少6分钟之后才会断开,如果少于6分钟,可能是您主机设置了空闲超时时间。 请参考一下: http://blog.chinaunix.net/uid-8473611-id-3069386.html 后续我们会加上链接超时控制,届时您可以自己设置超时时间,敬请期待。 ------------------------- 回 29楼(胡胡abc) 的帖子 您好,请问这台主机是linux是什么发行版本,是ECS么? ------------------------- 回 30楼(斯斯) 的帖子 不好意思哦,刚刚我们翻了下日志,并没能找到有记录ArrayIndexOutOfBound的错误。为了节省沟通成本,能否提供一下您当前主机的ip,和权限比较低的账号,密码供我们测试下? 如果可以的话能否提供下旺旺账号,我们可以去加你下。或者可以加我的账号,旺旺搜索"帅博"。 希望能高效地解决您的问题,感谢支持。 ------------------------- 回 43楼(不羁的行者) 的帖子 你好,目前文件管理模块还不支持上传文件夹。 建议打开dms的命令终端,直接输入rz命令上传噢。支持文件,文件夹,批量上传,拖动上传,功能很好用噢,O(∩_∩)O~ ------------------------- 回 48楼(fightgod) 的帖子 您好,我们以后会加入设置终端声音的功能,下个版本我们会暂时先去掉终端声音,等设置功能上线后再加上。O(∩_∩)O~ ------------------------- 回 50楼(fightgod) 的帖子 您好,windows系统和linux相比其内部机制和实现方式要复杂很多,目前我们的技术宅们正努力探索中。。。。 一旦技术方案定下来我们就会开展实施支持windows系统,敬请期待哦O(∩_∩)O~ ------------------------- 回 63楼(woaj01) 的帖子 您好,请问您的那台主机在ECS上已被删除多久了?我们这边也是通过api从ECS那边取的主机列表,api返回的数据会有一定的延迟,但也不会很久。 如果您的主机已经删除很久了,麻烦请告诉我们,我们会去和ECS方面沟通,解决这一问题 ------------------------- 回 66楼(fightgod) 的帖子 您好,您提的批量操作命令的界面,我们会认真考虑,如何去优化在主机较多的时候用户对终端返回的信息的同步。 您说的批量文件上传方面,我们恰巧将近期上线批量rz的功能,敬请期待哦O(∩_∩)O~ ------------------------- 回 69楼(初一) 的帖子 你好,能否详述一下你遇到的问题,是什么功能授权失败? ------------------------- 回 72楼(汇爱家) 的帖子 您好,您的建议我们会记录,并选择合适的配色方案,改进我们的用户体验,感谢反馈 ------------------------- 回 75楼(初一) 的帖子 您好,目前dms for linux的文件管理是支持更改文件所有者的。您可以右键->授权,弹出的授权框中可以更改所有者和用户组的信息。                                                                                      ------------------------- 回 76楼(meenet) 的帖子 您好,您是指怎么在线编辑文件? 我们的文件管理的功能可以直接编辑和保存文件的,如果是二进制文件还可以直接用二进制的方式打开,类似于UE的功能。 ------------------------- 回 79楼(啊彬彬) 的帖子 你好,请问你重启的是什么服务?一些系统服务是不能关闭的,关闭会导致系统不稳定甚至崩溃,重启下主机就可以恢复了。 ------------------------- 回 85楼(koder) 的帖子 您好,如果使用证书登录后目前仅可以查看非sudo权限的服务状态,需要sudo权限的服务,暂时是获取不到信息,通过控制台的系统管理-->服务管理可以进入相应页面。如果您想看所有服务的状态请先到控制台切换密码登陆。您的密码在我们后台都是经过严格加密处理的,所以您不用担心安全问题。 后续我们会针对证书登录用户,提供临时输入密码的交互。敬请继续关注我们dms产品 ------------------------- 回 86楼(樱花雾翔eva) 的帖子 您好,抱歉,我们dms控制台目前不支持删除数据库和ecs资源,资源列表是从ecs和rds控制台同步过来的,如果有资源过期被释放,dms控制台上相应也会释放。 我们后续控制台会加入资源隐藏的选项,可以暂时隐藏暂时不用的资源。感谢关注dms产品 ------------------------- 回 92楼(jasonyao525) 的帖子 您好,ssh服务关闭后就不能使用dms了,命令终端也不可以使用,您可以通过ecs控制台或者联系客服来重新开启该服务。 ------------------------- 回 90楼(jrl_limeng) 的帖子 您好,终端的颜色我们之前已经调整过,能否截个图看看?

数据管理dms 2019-12-02 02:01:24 0 浏览量 回答数 0

回答

前提条件 您需要开通容器服务和访问控制(RAM)服务。 登录 容器服务管理控制台和RAM 管理控制台开通相应的服务。 说明 用户账户需有 100 元的余额并通过实名认证,否则无法创建按量付费的 ECS 实例和负载均衡。 随集群一同创建的负载均衡实例只支持按量付费的方式。 Kubernetes 集群仅支持专有网络 VPC。 每个账号默认可以创建的云资源有一定的配额,如果超过配额创建集群会失败。请在创建集群前确认您的配额。如果您需要提高配额,请提交工单申请。 每个账号默认最多可以创建 5 个集群(所有地域下),每个集群中最多可以添加 40 个节点。如果您需要创建更多的集群或者节点,请提交工单申请。 说明 Kubernetes 集群中,VPC 默认路由条目不超过 48 条,意味着 Kubernetes 集群使用 VPC 时,默认节点上限是 48 个,如果需要更大的节点数,需要您先对目标 VPC 开工单,提高 VPC 路由条目,再对容器服务提交工单。 每个账号默认最多可以创建 100 个安全组。 每个账号默认最多可以创建 60 个按量付费的负载均衡实例。 每个账号默认最多可以创建 20 个EIP。 创建安全沙箱容器 Kubernetes 集群时,以下界面参数需要按照表中的要求配置,否则创建的集群将无法使用安全沙箱容器的场景。 参数 配置 可用区 目前只有神龙实例支持安全沙箱容器,请确保所选可用区有神龙实例。 kubernetes 版本 1.14.6-aliyun.1 或更高版本。 容器运行时 安全沙箱容器 Worker 实例 新增实例 节点类型 包年包月 实例规格 神龙裸金属服务器(神龙) 挂载数据盘 请至少挂载一块不小于 200GiB 的数据盘,建议 1T+。 操作系统类型 Linux 网络插件 Terway 操作步骤 登录容器服务管理控制台。 在控制台左侧导航栏中,选择集群 > 集群,进入集群列表页面。 单击页面右上角的创建 Kubernetes 集群,在弹出的选择集群模板页面,选择标准托管集群页面,并单击创建,进入Kubernetes 托管版页面。 集群配置页面 完成集群配置。 完成集群基础选项配置。 配置项 描述 集群名称 填写集群的名称。 说明 集群名称应包含 1~63 个字符,可包含数字、汉字、英文字符或连字符(-)。 Kubernetes 版本 选择 1.14.6-aliyun.1 或更高版本。 容器运行时 必须选择安全沙箱容器。 地域 选择集群所在的地域。 资源组 将鼠标悬浮于页面上方的账号全部资源,选择集群所在的资源组。这里显示选择的资源组。 专有网络 设置集群的网络。 说明 Kubernetes 集群仅支持专有网络。您可以在已有 VPC 列表中选择所需的 VPC。如果没有您需要的专有网络,可以通过单击创建专有网络进行创建,请参见创建专有网络。 虚拟交换机 设置虚拟交换机。 说明 您可以在已有虚拟交换机列表中,根据可用区选择 1-3 个交换机 。如果没有您需要的交换机,可以通过单击创建虚拟交换机进行创建,请参见创建交换机。 网络插件 安全沙箱容器集群的网络类型目前仅支持 Terway 。具体请参见如何使用Terway网络插件。 指定 Terway 网络插件需要为 Pod 选择可用的 VSwitch,这些 VSwitch 的网段掩码必须小于或等于 19,例如 172.17.128.0/19;当集群创建 Pod 时,会为 Pod 从选定的那些 VSwitch 网段中分配 IP。 Pod 虚拟交换机 您需要为 Pod 分配 IP 的虚拟交换机。每个 Pod 虚拟交换机分别对应一个 Worker 实例的虚拟交换机。 Service CIDR 您需要指定 Service CIDR,网段不能与 VPC 及 VPC 内已有 Kubernetes 集群使用的网段重复,创建成功后不能修改。而且 Service 地址段也不能和 Pod 地址段重复,有关 Kubernetes 网络地址段规划的信息,请参见VPC下 Kubernetes 的网络地址段规划。 配置 SNAT 设置是否为专有网络配置 SNAT 网关。 说明 如果您使用的 VPC 中当前已有 NAT 网关,容器服务会使用已有的 NAT 网关。 如果 VPC 中没有 NAT 网关,系统会默认自动为您创建一个 NAT 网关。如果您不希望系统自动创建 NAT 网关,可以取消勾选页面下方的为专有网络配置 SNAT。此时您需要自行配置 NAT 网关实现 VPC 安全访问公网环境,或者手动配置 SNAT,否则 VPC 内实例将不能正常访问公网,会导致集群创建失败。 公网访问 设置是否开放使用 EIP 暴露 API Server。 说明 API Server 提供了各类资源对象(Pod,Service 等)的增删改查及 watch 等 HTTP Rest 接口。 如果选择开放,会创建一个 EIP,并挂载到内网 SLB 上。此时,Master 节点的 6443 端口(对应 API Server)暴露出来,用户可以在外网通过 kubeconfig 连接或操作集群。 如果选择不开放,则不会创建 EIP,用户只能在 VPC 内部用 kubeconfig 连接并操作集群。 RDS 白名单 设置 RDS 白名单。将节点 IP 添加到 RDS 实例的白名单中。 说明 允许白名单 RDS 访问 Kubernetes 集群,RDS 必须在当前集群的 VPC 内。 自定义安全组 设置安全组。单击请选择安全组,在弹出的页面选中目标安全组,单击确定。 详细内容请参见安全组概述。 说明 当前只有白名单用户可使用该功能。提交工单申请使用。 完成集群高级选项配置。 配置项 描述 kube-proxy 代理模式 支持 iptables 和 IPVS 两种模式。 iptables:成熟稳定的 kube-proxy 代理模式,Kubernetes service 的服务发现和负载均衡使用 iptables 规则配置,但性能一般,受规模影响较大,适用于集群存在少量的 service。 IPVS:高性能的 kube-proxy 代理模式,Kubernetes service 的服务发现和负载均衡使用 Linux ipvs 模块进行配置,适用于集群存在大量的 service,对负载均衡有高性能要求的场景。 标签 为集群绑定标签。输入键和对应的值,单击添加。 说明 键是必需的,而 值 是可选的,可以不填写。 键不能是 aliyun、http:// 、https:// 开头的字符串,不区分大小写,最多 64 个字符。 值不能是 http:// 或 https://,可以为空,不区分大小写,最多 128 个字符。 同一个资源,标签键不能重复,相同标签键(Key)的标签会被覆盖。 如果一个资源已经绑定了 20 个标签,已有标签和新建标签会失效,您需要解绑部分标签后才能再绑定新的标签。 集群本地域名 设置是否配置集群本地域名。 说明 默认域名为 cluster.local,可自定义域名。域名由两段组成,每段不超过 63 个字符,且只能使用大小写字母和数字,不能为空。 集群删除保护 设置是否启用集群删除保护。为防止通过控制台或 API 误释放集群。 单击下一步:Worker 配置,完成 Worker 节点配置。 说明 安全沙箱容器场景下, Worker 节点仅支持神龙工作节点,选择神龙型号为 ecs.ebmg5s.24xlarge 完成 Work 节点基础选项配置。 配置项 描述 Worker 实例 只支持新增实例,暂不支持添加已有实例。 付费类型 神龙实例付费模式只支持包年包月,不支持按量付费。 购买时长 选择包年包月时,需设置购买时长。目前支持选择 1、2、3、6 和12 个月。 自动续费 选择包年包月时,需设置是否自动续费。 实例规格 目前机型仅支持神龙裸金属服务器(神龙),该机型的实例规格均可使用。 已选规格 已选的实例规格。只能选择一个规格。 数量 新增 Worker 实例的数量。 系统盘 支持 SSD 云盘和高效云盘。 挂载数据盘 支持 SSD 云盘、高效云盘和普通云盘。 说明 挂载的数据盘用于存储节点上所有容器的根文件系统。因此,请至少挂载一块不小于 200 GiB 的数据盘,建议 1T 以上。 操作系统 安全沙箱容器集群仅支持 Linux 系统。 登录方式 设置密钥。 您需要在创建集群的时候选择密钥对登录方式,单击新建密钥对,跳转到 ECS 云服务器控制台,创建密钥对,参见创建SSH密钥对。密钥对创建完毕后,设置该密钥对作为登录集群的凭据。 设置密码。 登录密码:设置节点的登录密码。 确认密码:确认设置的节点登录密码。 密钥对 设置高级选项。 配置项 描述 实例保护 设置是否启用实例保护。 说明 为防止通过控制台或 API 误释放集群节点,默认启用实例保护。 实例自定义数据 请参见生成实例自定义数据。 自定义镜像 不要选择自定义镜像。安全沙箱容器集群不支持使用自定义镜像。 自定义节点名称 是否开启自定义节点名称。 节点名称由前缀 + 节点 IP 地址子串 + 后缀三部分组成: 前缀和后缀均可由.分隔的一个或多个部分构成,每个部分可以使用小写字母、数字和-,且首尾必须为小写字母和数字。 IP 地址段长度指截取节点 IP 地址末尾的位数,取值范围 5-12。 例如:节点 IP 地址为192.168.0.55,指定前缀为 aliyun.com,IP 地址段长度为 5,后缀为 test,则节点名称为aliyun.com00055test。 CPU Policy 设置 CPU policy。 none:默认策略,表示启用现有的默认 CPU 亲和方案。 static:允许为节点上具有某些资源特征的 Pod 赋予增强的 CPU 亲和性和独占性。 污点(Taints) 为集群内所有Worker节点添加污点。 单击下一步:组件配置,完成组件配置。 配置项 描述 Ingress 设置是否安装 Ingress 组件。默认勾选安装 Ingress 组件 ,请参见 Ingress 支持。 说明 如果您勾选创建 Ingress Dashboard,则需要同步安装日志服务组件。 存储插件 设置存储插件,支持 Flexvolume 和 CSI。Kubernetes 集群通过 Pod 可自动绑定阿里云云盘、NAS、 OSS 存储服务。请参见存储管理-Flexvolume 和存储管理-CSI。 云监控插件 设置是否启用云监控插件。您可以选择在 ECS 节点上安装云监控插件,从而在云监控控制台查看所创建 ECS 实例的监控信息。 日志服务 设置是否启用日志服务,您可使用已有 Project 或新建一个 Project。 勾选使用日志服务,会在集群中自动配置日志服务插件。创建应用时,您可通过简单配置,快速使用日志服务,详情参见使用日志服务进行Kubernetes日志采集。 工作流引擎 设置是否使用 AGS。 如果勾选 AGS,则创建集群时系统自动安装 AGS 工作流插件。 如果不勾选,则需要手动安装 AGS 工作流插件,请参见AGS命令行帮助。 可选组件 在系统组件之外,还可以选择安装容器服务提供的其他组件。 单击创建集群,在弹出的当前配置确认页面,单击创建,启动部署。 说明 一个包含多节点的 Kubernetes 集群的创建时间一般约为十分钟。 执行结果 集群创建成功后,您可以在容器服务管理控制台的 Kubernetes 集群列表页面查看所创建的集群。集群列表 您可以单击集群操作列的查看日志,进入集群日志信息页面查看集群的日志信息。 您也可以在集群日志信息页面中,单击资源栈事件查看更详细的信息。集群日志详情 在集群列表页面中,找到刚创建的集群,单击操作列中的管理,查看集群的基本信息和连接信息。集群基本信息 其中: API Server 公网连接端点:Kubernetes 的 API Server 对公网提供服务的地址和端口,可以通过此服务在用户终端使用 kubectl 等工具管理集群。 API Service 内网连接端点:Kubernetes 的 API server 对集群内部提供服务的地址和端口,此 IP 为负载均衡的地址。 Pod网络CIDR:Kubernetes 的 Pod CIDR 定义集群内 Pod 的网段范围。 Service CIDR:Kubernetes 的 Service CIDR 定义集群内暴露服务的网段范围。 测试域名:为集群中的服务提供测试用的访问域名。服务访问域名后缀是 <cluster_id>.<region_id>.alicontainer.com。 kube-proxy 代理模式:Kubernetes service 的服务发现和负载均衡需要通过服务代理进行配置,支持 iptables 和 IPVS 两种模式。 节点 Pod 数量:单个节点可运行 Pod 数量的上限,默认值为 128。 您可以通过kubectl连接Kubernetes集群,执行 kubectl get node查看集群的节点信息。集群结果

huc_逆天 2020-03-26 18:16:45 0 浏览量 回答数 0

回答

您可以通过容器服务控制台非常方便的创建安全沙箱容器集群。 前提条件 您需要开通容器服务和访问控制(RAM)服务。 登录 容器服务管理控制台和RAM 管理控制台开通相应的服务。 说明 用户账户需有 100 元的余额并通过实名认证,否则无法创建按量付费的 ECS 实例和负载均衡。 随集群一同创建的负载均衡实例只支持按量付费的方式。 Kubernetes 集群仅支持专有网络 VPC。 每个账号默认可以创建的云资源有一定的配额,如果超过配额创建集群会失败。请在创建集群前确认您的配额。如果您需要提高配额,请提交工单申请。 每个账号默认最多可以创建 5 个集群(所有地域下),每个集群中最多可以添加 40 个节点。如果您需要创建更多的集群或者节点,请提交工单申请。 说明 Kubernetes 集群中,VPC 默认路由条目不超过 48 条,意味着 Kubernetes 集群使用 VPC 时,默认节点上限是 48 个,如果需要更大的节点数,需要您先对目标 VPC 开工单,提高 VPC 路由条目,再对容器服务提交工单。 每个账号默认最多可以创建 100 个安全组。 每个账号默认最多可以创建 60 个按量付费的负载均衡实例。 每个账号默认最多可以创建 20 个EIP。 创建安全沙箱容器 Kubernetes 集群时,以下界面参数需要按照表中的要求配置,否则创建的集群将无法使用安全沙箱容器的场景。 参数 配置 可用区 目前只有神龙实例支持安全沙箱容器,请确保所选可用区有神龙实例。 kubernetes 版本 1.14.6-aliyun.1 或更高版本。 容器运行时 安全沙箱容器 Worker 实例 新增实例 节点类型 包年包月 实例规格 神龙裸金属服务器(神龙) 挂载数据盘 请至少挂载一块不小于 200GiB 的数据盘,建议 1T+。 操作系统类型 Linux 网络插件 Terway 操作步骤 登录容器服务管理控制台。 在控制台左侧导航栏中,选择集群 > 集群,进入集群列表页面。 单击页面右上角的创建 Kubernetes 集群,在弹出的选择集群模板页面,选择标准托管集群页面,并单击创建,进入Kubernetes 托管版页面。 集群配置页面 完成集群配置。 完成集群基础选项配置。 配置项 描述 集群名称 填写集群的名称。 说明 集群名称应包含 1~63 个字符,可包含数字、汉字、英文字符或连字符(-)。 Kubernetes 版本 选择 1.14.6-aliyun.1 或更高版本。 容器运行时 必须选择安全沙箱容器。 地域 选择集群所在的地域。 资源组 将鼠标悬浮于页面上方的账号全部资源,选择集群所在的资源组。这里显示选择的资源组。 专有网络 设置集群的网络。 说明 Kubernetes 集群仅支持专有网络。您可以在已有 VPC 列表中选择所需的 VPC。如果没有您需要的专有网络,可以通过单击创建专有网络进行创建,请参见创建专有网络。 虚拟交换机 设置虚拟交换机。 说明 您可以在已有虚拟交换机列表中,根据可用区选择 1-3 个交换机 。如果没有您需要的交换机,可以通过单击创建虚拟交换机进行创建,请参见创建交换机。 网络插件 安全沙箱容器集群的网络类型目前仅支持 Terway 。具体请参见如何使用Terway网络插件。 指定 Terway 网络插件需要为 Pod 选择可用的 VSwitch,这些 VSwitch 的网段掩码必须小于或等于 19,例如 172.17.128.0/19;当集群创建 Pod 时,会为 Pod 从选定的那些 VSwitch 网段中分配 IP。 Pod 虚拟交换机 您需要为 Pod 分配 IP 的虚拟交换机。每个 Pod 虚拟交换机分别对应一个 Worker 实例的虚拟交换机。 Service CIDR 您需要指定 Service CIDR,网段不能与 VPC 及 VPC 内已有 Kubernetes 集群使用的网段重复,创建成功后不能修改。而且 Service 地址段也不能和 Pod 地址段重复,有关 Kubernetes 网络地址段规划的信息,请参见VPC下 Kubernetes 的网络地址段规划。 配置 SNAT 设置是否为专有网络配置 SNAT 网关。 说明 如果您使用的 VPC 中当前已有 NAT 网关,容器服务会使用已有的 NAT 网关。 如果 VPC 中没有 NAT 网关,系统会默认自动为您创建一个 NAT 网关。如果您不希望系统自动创建 NAT 网关,可以取消勾选页面下方的为专有网络配置 SNAT。此时您需要自行配置 NAT 网关实现 VPC 安全访问公网环境,或者手动配置 SNAT,否则 VPC 内实例将不能正常访问公网,会导致集群创建失败。 公网访问 设置是否开放使用 EIP 暴露 API Server。 说明 API Server 提供了各类资源对象(Pod,Service 等)的增删改查及 watch 等 HTTP Rest 接口。 如果选择开放,会创建一个 EIP,并挂载到内网 SLB 上。此时,Master 节点的 6443 端口(对应 API Server)暴露出来,用户可以在外网通过 kubeconfig 连接或操作集群。 如果选择不开放,则不会创建 EIP,用户只能在 VPC 内部用 kubeconfig 连接并操作集群。 RDS 白名单 设置 RDS 白名单。将节点 IP 添加到 RDS 实例的白名单中。 说明 允许白名单 RDS 访问 Kubernetes 集群,RDS 必须在当前集群的 VPC 内。 自定义安全组 设置安全组。单击请选择安全组,在弹出的页面选中目标安全组,单击确定。 详细内容请参见安全组概述。 说明 当前只有白名单用户可使用该功能。提交工单申请使用。 完成集群高级选项配置。 配置项 描述 kube-proxy 代理模式 支持 iptables 和 IPVS 两种模式。 iptables:成熟稳定的 kube-proxy 代理模式,Kubernetes service 的服务发现和负载均衡使用 iptables 规则配置,但性能一般,受规模影响较大,适用于集群存在少量的 service。 IPVS:高性能的 kube-proxy 代理模式,Kubernetes service 的服务发现和负载均衡使用 Linux ipvs 模块进行配置,适用于集群存在大量的 service,对负载均衡有高性能要求的场景。 标签 为集群绑定标签。输入键和对应的值,单击添加。 说明 键是必需的,而 值 是可选的,可以不填写。 键不能是 aliyun、http:// 、https:// 开头的字符串,不区分大小写,最多 64 个字符。 值不能是 http:// 或 https://,可以为空,不区分大小写,最多 128 个字符。 同一个资源,标签键不能重复,相同标签键(Key)的标签会被覆盖。 如果一个资源已经绑定了 20 个标签,已有标签和新建标签会失效,您需要解绑部分标签后才能再绑定新的标签。 集群本地域名 设置是否配置集群本地域名。 说明 默认域名为 cluster.local,可自定义域名。域名由两段组成,每段不超过 63 个字符,且只能使用大小写字母和数字,不能为空。 集群删除保护 设置是否启用集群删除保护。为防止通过控制台或 API 误释放集群。 单击下一步:Worker 配置,完成 Worker 节点配置。 说明 安全沙箱容器场景下, Worker 节点仅支持神龙工作节点,选择神龙型号为 ecs.ebmg5s.24xlarge 完成 Work 节点基础选项配置。 配置项 描述 Worker 实例 只支持新增实例,暂不支持添加已有实例。 付费类型 神龙实例付费模式只支持包年包月,不支持按量付费。 购买时长 选择包年包月时,需设置购买时长。目前支持选择 1、2、3、6 和12 个月。 自动续费 选择包年包月时,需设置是否自动续费。 实例规格 目前机型仅支持神龙裸金属服务器(神龙),该机型的实例规格均可使用。 已选规格 已选的实例规格。只能选择一个规格。 数量 新增 Worker 实例的数量。 系统盘 支持 SSD 云盘和高效云盘。 挂载数据盘 支持 SSD 云盘、高效云盘和普通云盘。 说明 挂载的数据盘用于存储节点上所有容器的根文件系统。因此,请至少挂载一块不小于 200 GiB 的数据盘,建议 1T 以上。 操作系统 安全沙箱容器集群仅支持 Linux 系统。 登录方式 设置密钥。 您需要在创建集群的时候选择密钥对登录方式,单击新建密钥对,跳转到 ECS 云服务器控制台,创建密钥对,参见创建SSH密钥对。密钥对创建完毕后,设置该密钥对作为登录集群的凭据。 设置密码。 登录密码:设置节点的登录密码。 确认密码:确认设置的节点登录密码。 密钥对 设置高级选项。 配置项 描述 实例保护 设置是否启用实例保护。 说明 为防止通过控制台或 API 误释放集群节点,默认启用实例保护。 实例自定义数据 请参见生成实例自定义数据。 自定义镜像 不要选择自定义镜像。安全沙箱容器集群不支持使用自定义镜像。 自定义节点名称 是否开启自定义节点名称。 节点名称由前缀 + 节点 IP 地址子串 + 后缀三部分组成: 前缀和后缀均可由.分隔的一个或多个部分构成,每个部分可以使用小写字母、数字和-,且首尾必须为小写字母和数字。 IP 地址段长度指截取节点 IP 地址末尾的位数,取值范围 5-12。 例如:节点 IP 地址为192.168.0.55,指定前缀为 aliyun.com,IP 地址段长度为 5,后缀为 test,则节点名称为aliyun.com00055test。 CPU Policy 设置 CPU policy。 none:默认策略,表示启用现有的默认 CPU 亲和方案。 static:允许为节点上具有某些资源特征的 Pod 赋予增强的 CPU 亲和性和独占性。 污点(Taints) 为集群内所有Worker节点添加污点。 单击下一步:组件配置,完成组件配置。 配置项 描述 Ingress 设置是否安装 Ingress 组件。默认勾选安装 Ingress 组件 ,请参见 Ingress 支持。 说明 如果您勾选创建 Ingress Dashboard,则需要同步安装日志服务组件。 存储插件 设置存储插件,支持 Flexvolume 和 CSI。Kubernetes 集群通过 Pod 可自动绑定阿里云云盘、NAS、 OSS 存储服务。请参见存储管理-Flexvolume 和存储管理-CSI。 云监控插件 设置是否启用云监控插件。您可以选择在 ECS 节点上安装云监控插件,从而在云监控控制台查看所创建 ECS 实例的监控信息。 日志服务 设置是否启用日志服务,您可使用已有 Project 或新建一个 Project。 勾选使用日志服务,会在集群中自动配置日志服务插件。创建应用时,您可通过简单配置,快速使用日志服务,详情参见使用日志服务进行Kubernetes日志采集。 工作流引擎 设置是否使用 AGS。 如果勾选 AGS,则创建集群时系统自动安装 AGS 工作流插件。 如果不勾选,则需要手动安装 AGS 工作流插件,请参见AGS命令行帮助。 可选组件 在系统组件之外,还可以选择安装容器服务提供的其他组件。 单击创建集群,在弹出的当前配置确认页面,单击创建,启动部署。 说明 一个包含多节点的 Kubernetes 集群的创建时间一般约为十分钟。 执行结果 集群创建成功后,您可以在容器服务管理控制台的 Kubernetes 集群列表页面查看所创建的集群。集群列表 您可以单击集群操作列的查看日志,进入集群日志信息页面查看集群的日志信息。 您也可以在集群日志信息页面中,单击资源栈事件查看更详细的信息。集群日志详情 在集群列表页面中,找到刚创建的集群,单击操作列中的管理,查看集群的基本信息和连接信息。集群基本信息 其中: API Server 公网连接端点:Kubernetes 的 API Server 对公网提供服务的地址和端口,可以通过此服务在用户终端使用 kubectl 等工具管理集群。 API Service 内网连接端点:Kubernetes 的 API server 对集群内部提供服务的地址和端口,此 IP 为负载均衡的地址。 Pod网络CIDR:Kubernetes 的 Pod CIDR 定义集群内 Pod 的网段范围。 Service CIDR:Kubernetes 的 Service CIDR 定义集群内暴露服务的网段范围。 测试域名:为集群中的服务提供测试用的访问域名。服务访问域名后缀是 <cluster_id>.<region_id>.alicontainer.com。 kube-proxy 代理模式:Kubernetes service 的服务发现和负载均衡需要通过服务代理进行配置,支持 iptables 和 IPVS 两种模式。 节点 Pod 数量:单个节点可运行 Pod 数量的上限,默认值为 128。 您可以通过kubectl连接Kubernetes集群,执行 kubectl get node查看集群的节点信息。集群结果 上一篇:概述

1934890530796658 2020-03-26 18:10:44 0 浏览量 回答数 0

回答

首先,我们计算如图B-1所示的部分和。我们把每一列相加,如果有进位,就加到下一列。注意以下几点:1-->161 1-->15* 1-->14* 1-->13* * 1 1-->12* * * 1-->11* * * * 1-->10* * * * * 1 1-->9* * * * * * * 1 1-->7* * * * * * * * * 1-->6* * * * * * * * * 1-->5* * * * * * * * * 1-->4* * * * * * * * * * 1-->3* * * * * * * * * * * * 1 1-->2* * * * * * * * * * * * 1-->第1的进位,以上同义(右起为第一列)1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 00 0 0 0 1 0 0 0 0 1 1 0 1 0 0 11 0 1 0 1 0 1 1 0 0 0 0 0 0 1 00 0 0 0 1 1 1 0 0 0 0 0 1 0 1 00 0 0 0 0 0 0 0 0 0 0 1 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 1 0 0 0 0 1 1 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 1 1 0 10 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 1 0 1 0 1 0 0 0 1 0 0 0 1 0 10 1 0 1 0 0 1 1 0 1 0 1 0 1 0 00 1 0 0 1 0 0 1 0 1 0 0 1 1 1 10 1 0 0 0 1 1 1 0 0 0 0 0 0 0 01 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 部分和1 -->第15列的进位1 -->第16列的进位1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 和0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 校验和图B-1 二进制记法的部分和1,当我们加第1列(最右边一列)的时候,我们得到8。在二进制中,数8是1000。我们保留最右边的0,把其余的位进到第2列,第3列和第4列。2,当我们加第2列时,我们计入从第1列来的进位。结果是7,它是二进制的0111。我们保留第一个位(最右边的),把其余011进位给第3列、第4列和第5列。3,对每一列重复以上过程。4,当我们加完最后一列时,我们有两个1没有列可以进行进位。这两个1在下一个步骤中应与部分和(Partial sum)相加。B.1.2和如果最后一列没有进位,那么部分和就是和。但是,如果还有额外的列(在本例中,有一个具有两行的列),那么就要把它加到部分和中,以便得出和。下图给出了这样的计算,我们得出了和。1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 部分和1 0 -->第15,16列的进位1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 和0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 校验和图B-2 二进制记法的和与校验和B.1.2校验和在计算出和以后,我们把每一个位求反码,得出检验和。图B-2也给出了检验和。二进制计算方法其实可以转换为十进制计算,原理相同。算法的实现:首先,查看了Linux 2.6内核中的校验算法,使用汇编语言编写的,显然效率要高些。代码如下:unsigned short ip_fast_csum(unsigned char * iph,unsigned int ihl){unsigned int sum;__asm__ __volatile__("movl (%1), %0 ;\n""subl $4, %2 ;\n""jbe 2f ;\n""addl 4(%1), %0 ;\n""adcl 8(%1), %0 ;\n""adcl 12(%1), %0 ;\n""1: adcl 16(%1), %0 ;\n""lea 4(%1), %1 ;\n""decl %2 ;\n""jne 1b ;\n""adcl $0, %0 ;\n""movl %0, %2 ;\n""shrl $16, %0 ;\n""addw %w2, %w0 ;\n""adcl $0, %0 ;\n""notl %0 ;\n""2: ;\n"/* Since the input registers which are loaded with iph and ihlare modified, we must also specify them as outputs, or gccwill assume they contain their original values. */: "=r" (sum), "=r" (iph), "=r" (ihl): "1" (iph), "2" (ihl): "memory");return(sum);}在这个函数中,第一个参数显然就是IP数据报的首地址,所有算法几乎一样。需要注意的是第二个参数,它是直接使用IP数据报头信息中的首部长度字段,不需要进行转换,因此,速度又快了(高手就是考虑的周到)。使用方法会在下面的例子代码中给出。第二种算法就非常普通了,是用C语言编写的。我看了许多实现网络协议栈的代码,这个算法是最常用的了,即使变化,也无非是先取反后取和之类的。考虑其原因,估计还是C语言的移植性更好吧。下面是该函数的实现:unsigned short checksum(unsigned short *buf,int nword){unsigned long sum;for(sum=0;nword>0;nword--){sum += *buf++;sum = (sum>>16) + (sum&0xffff);}return ~sum;}

游客886 2019-12-02 01:29:02 0 浏览量 回答数 0

问题

厉华:写一个开源容器引擎会是什么样的体验? 热:报错

kun坤 2020-06-10 10:01:12 3 浏览量 回答数 1

问题

【eoeAndroid精华推荐】Android逆向之巧妙利用asm修改方法得到需要的信息

eoe 2019-12-01 21:37:28 12270 浏览量 回答数 6

问题

Nginx性能为什么如此吊

小柒2012 2019-12-01 21:20:47 15038 浏览量 回答数 3

回答

调用CreateCluster创建一个新的Managed Kubernetes集群实例,并创建指定数量的节点。 请求信息 请求行RequestLine POST /clusters HTTP/1.1 特有请求头 RequestHead 无,请参考公共请求头部。 请求体 RequestBody 说明 创建集群时,请求参数需要正确组合,否则会导致集群创建失败。在容器服务控制台创建集群界面,提供了生成集群创建OpenAPI参数功能,可以为您提供准确的参数组合。请参见生成 OpenAPI 参数。 { "disable_rollback": "失败是否回滚", "name": "集群名称", "timeout_mins": "集群创建超时时间", "cluster_type": "集群类型,ManagedKubernetes", "region_id": "地域", "vpcid": "VPC ID", "vswitch_ids": "一台或多台虚拟交换机 ID,N 的取值范围为 [1,3]", "container_cidr": "容器POD CIDR。", "service_cidr": "服务CIDR", "cloud_monitor_flags":"是否安装云监控插件", "login_password": "节点SSH登录密码,和key_pair二选一", "key_pair":"keypair名称,和login_password 二选一", "worker_instance_charge_type":"Worker节点付费类型PrePaid|PostPaid", "worker_period_unit":"包年包月单位,Month,Year,只有在PrePaid下生效", "worker_period":"包年包月时长,只有在PrePaid下生效", "worker_auto_renew":"Worker节点自动续费true|false", "worker_auto_renew_period":"Worker节点续费周期", "worker_instance_types": "Worker实例规格多实例规格参数 ", "worker_system_disk_category": "Worker系统盘类型", "worker_system_disk_size": "Worker节点系统盘大小", "worker_data_disk":"是否挂载数据盘 true|false", "worker_data_disks":"Worker节点数据盘配置", "num_of_nodes": "Worker节点数", "snat_entry": "是否配置SNATEntry", "endpoint_public_access":"是否公网暴露集群endpoint", "proxy_mode": "网络模式, 可选值iptables|ipvs", "addons": "选装addon, 数组格式对象", "tags": "给集群打tag标签, 数组格式对象", "security_group_id": "安全组ID", "taints": "给节点添加taint, 数组格式对象", "cpu_policy":"cpu的策略,static|none", "runtime":"容器的运行时环境,一般为docker", "platform":"运行pod的主机的平台架构", "os_type":"运行pod的主机的操作系统类型,例如:linux,Windows...", "node_cidr_mask":"节点网络的网络ID的位数", "kubernetes_version":"kubernetes集群的版本,默认最新版本", "deletion_protection":"是否开启集群删除保护,防止通过控制台或api误删除集群" } 表 1. 请求体解释 名称 类型 必须 描述 cluster_type string 是 集群类型。 key_pair string 是 keypair名称。与login_password二选一。 login_password string 是 SSH登录密码。密码规则为8 - 30 个字符,且至少同时包含三项(大小写字母、数字和特殊符号)。和key_pair 二选一。 name string 是 集群名称,集群名称可以使用大小写英文字母、中文、数字、中划线。 num_of_nodes int 是 Worker节点数。范围是[0,100]。 region_id string 是 集群所在地域ID。 snat_entry bool 是 是否为网络配置SNAT。如果是自动创建VPC必须设置为true。如果使用已有VPC则根据是否具备出网能力来设置。 vswitch_ids list 是 交换机ID。List长度范围为 [1,3]。 worker_system_disk_category string 是 Worker节点系统盘类型。 worker_system_disk_size int 是 Worker节点系统盘大小。 addons list 否 Kubernetes集群的addon插件的组合。 addons的参数: name:必填,addon插件的名称。 version:可选,取值为空时默认取最新版本。 config:可选,取值为空时表示无需配置。 网络插件:包含Flannel和Terway网络插件,二选一。 日志服务:可选,如果不开启日志服务时,将无法使用集群审计功能。 Ingress:默认开启安装Ingress组件。 container_cidr string 否 容器网段,不能和VPC网段冲突。当选择系统自动创建VPC时,默认使用172.16.0.0/16网段。 cloud_monitor_flags bool 否 是否安装云监控插件。 disable_rollback bool 否 失败是否回滚: true:表示失败不回滚。 false:表示失败回滚。 如果选择失败回滚,则会释放创建过程中所生产的资源,不推荐使用false。 public_slb bool 否 是否开启公网API Server: true:默认为True,表示开放公网API Server。 false:若设置为false, 则不会创建公网的API Server,仅创建私网的API Server。 说明 过期参数,替代参数请参见endpoint_public_access。 proxy_mode string 否 kube-proxy代理模式,支持iptables和IPVS两种模式。 默认为iptables。 endpoint_public_access bool 否 是否开启公网API Server: true:默认为True,表示开放公网API Server。 false:若设置为false, 则不会创建公网的API Server,仅创建私网的API Server。 security_group_id string 否 指定集群ECS实例所属于的安全组ID。 service_cidr string 否 服务网段,不能和VPC网段以及容器网段冲突。当选择系统自动创建VPC时,默认使用172.19.0.0/20网段。 tags list 否 给集群打tag标签: key:标签名称。 value:标签值。 taints list 否 用于给节点做污点标记,通常用于 Pods 的调度策略。与之相对应的概念为:容忍(tolerance),若 Pods 上有相对应的 tolerance 标记,则可以容忍节点上的污点,并调度到该节点。 timeout_mins int 否 集群资源栈创建超时时间,以分钟为单位,默认值 60分钟。 vpcid string 否 VPC ID,可空。如果不设置,系统会自动创建VPC,系统创建的VPC网段为192.168.0.0/16。 VpcId 和 vswitchid 只能同时为空或者同时都设置相应的值。 worker_auto_renew bool 否 是否开启Worker节点自动续费,可选值为: true:自动续费。 false:不自动续费。 worker_auto_renew_period int 否 自动续费周期,当worker_instance_charge_type取值为PrePaid时才生效且为必选值。PeriodUnit=Month时,取值为{“1”,“2”,“3”,“6”,“12”}。 worker_data_disk string 否 是否挂载数据盘,可选择: true:表示worker节点挂载数据盘。 false:表示worker节点不挂载数据盘。 worker_data_disks list 否 Worker数据盘类型、大小等配置的组合。该参数只有在挂载Worker节点数据盘时有效,包含以下参数: category:数据盘类型。取值范围: cloud:普通云盘。 cloud_efficiency:高效云盘。 cloud_ssd:SSD云盘。 size:数据盘大小,单位为GiB。 worker_data_disk_category int 否 数据盘类型 说明 过期参数,替代参数请参见worker_data_disks参数中的category取值。 worker_data_disk_size string 否 数据盘大小 说明 过期参数,替代参数请参见worker_data_disks参数中的size取值。 worker_instance_charge_type string 否 Worker节点付费类型,可选值为: PrePaid:预付费。 PostPaid:按量付费。 worker_period int 否 包年包月时长,当worker_instance_charge_type取值为PrePaid时才生效且为必选值。PeriodUnit=Month时,Period取值:{ “1”,“2”,“3”,“6”,“12”} 。 worker_period_unit string 否 当指定为PrePaid的时候需要指定周期。 说明 Month:以月为计时单位。 worker_instance_types list 是 Worker 节点 ECS 规格类型代码。更多详细信息,参见实例规格族。 cpu_policy string 否 CPU策略。集群版本为1.12.6及以上版本支持static 和 none两种策略。默认为none。 runtime json 否 容器运行时,一般为docker,包括2个信息 name:容器运行时名称。 version:容器运行时版本。 platform string 否 运行Pod的主机的平台架构。 os_type string 否 运行Pod的主机的操作系统类型,例如Linux,Windows。 node_cidr_mask int 否 节点网络的网络前缀。node_cidr_mask通过cidr限制一个节点上能运行容器网络的Pod数量。例如node_cidr_mask是24的话,对应的容器数量是256,25对应的就是128。计算方式:2^(node_cidr_mask的值-24)-1。 kubernetes_version string 否 Kubernetes集群的版本,默认最新版本。 deletion_protection bool 否 是否开启集群删除保护,防止通过控制台或API误删除集群。 返回信息 返回行 ResponseLine HTTP/1.1 202 Accepted 特有返回头 ResponseHead 无,请参考公共返回头部。 返回体 ResponseBody { "cluster_id":"string", "request_id":"string", "task_id":"string" } 示例 请求示例 POST /clusters HTTP/1.1 <公共请求头> { "name":"test", "cluster_type":"my-test-Kubernetes-cluster", "disable_rollback":true, "timeout_mins":60, "kubernetes_version":"1.12.6-aliyun.1", "region_id":"cn-beijing", "snat_entry":true, "cloud_monitor_flags":false, "endpoint_public_access":false, "node_cidr_mask":"25", "proxy_mode":"ipvs", "tags":[], "addons": [{"name": "flannel"},{"name": "aliyun-log-controller","config": "{"sls_project_name":"k8s-log-c64f6eab6a1764d3dbee3dc2b9e41****"}"},{"name": "nginx-ingress-controller", "config": "{"IngressSlbNetworkType":"internet"}"}], "worker_instance_types":["ecs.hfc5.xlarge"], "num_of_nodes":3, "worker_system_disk_category":"cloud_efficiency", "worker_system_disk_size":120, "worker_instance_charge_type":"PostPaid", "vpcid":"vpc-2zegvl5etah5requ09nec", "container_cidr":"172.20.0.0/16", "service_cidr":"172.21.0.0/20", "vswitch_ids":["vsw-2ze48rkq464rsdts1****"], "worker_data_disks": [{"category": "cloud_ssd", "size": 500}], "login_password":"test@19****", "taint":[{"key": "special", "value": "true", "effect": "NoSchedule"}] } 返回示例 HTTP/1.1 202 Accepted <公共响应头> { "cluster_id": "cb95aa626a47740afbf6aa099b65****", "request_id": "687C5BAA-D103-4993-884B-C35E4314A1E1", "task_id": "T-5a54309c80282e39ea00002f" }

1934890530796658 2020-04-01 10:53:02 0 浏览量 回答数 0

回答

调用CreateCluster创建一个新的Kubernetes集群实例,并新建指定数量的节点。 请求信息 请求行RequestLine POST /clusters HTTP/1.1 特有请求头RequestHead 无,请参考公共请求头部。 请求体RequestBody 说明 创建集群时,请求参数需要正确组合,否则会导致集群创建失败。在容器服务控制台创建集群界面,提供了生成集群创建OpenAPI参数功能,可以为您提供准确的参数组合。请参见生成 OpenAPI 参数。 { "disable_rollback": "失败是否回滚", "name": "集群名称", "timeout_mins": "集群创建超时时间", "cluster_type": "集群类型,Kubernetes", "region_id": "地域", "vpcid": "VPC ID", "master_vswitch_ids": "master节点交换机ID。填写3个vswitchid, 尽量是分别在3个不同az, 保证高可用", "master_instance_types": "master节点实例类型。填写3个实例规格", "master_count": "master实例个数,支持3|5", "container_cidr": "容器POD CIDR", "service_cidr": "服务CIDR", "ssh_flags": "是否开放公网SSH登录", "cloud_monitor_flags": "是否安装云监控插件", "login_password": "节点SSH登录密码,和key_pair二选一", "key_pair": "keypair名称,和login_password 二选一", "master_instance_charge_type": "Master实例付费类型,PostPaid|PrePaid", "master_period_unit": "包年包月单位,Month,Year,只有在PrePaid下生效", "master_period": "包年包月时长,只有在PrePaid下生效", "master_auto_renew": "Master节点是否自动续费", "master_auto_renew_period": "Master节点续费周期", "master_system_disk_category": "Master系统盘类型", "master_system_disk_size": "Master节点系统盘大小", "master_data_disk(已弃用)": "Master节点是否挂载数据盘", "master_data_disks": "Master节点数据盘配置", "master_system_disk_snapshot_policy_id": "Master节点系统盘快照策略ID", "worker_instance_charge_type": "Worker节点付费类型PrePaid|PostPaid", "worker_period_unit": "包年包月单位,Month,Year,只有在PrePaid下生效", "worker_period": "包年包月时长,只有在PrePaid下生效", "worker_auto_renew": "Worker节点自动续费true|false", "worker_auto_renew_period": "Worker节点续费周期", "worker_instance_types": "Worker实例规格多实例规格参数", "worker_vswitch_ids": "一台或多台虚拟交换机 ID,N 的取值范围为 [1, 5]", "worker_system_disk_category": "Worker系统盘类型", "worker_system_disk_size": "Worker节点系统盘大小", "worker_data_disk(已弃用)": "Worker节点是否挂载数据盘", "worker_data_disks": "Worker节点数据盘配置", "worker_system_disk_snapshot_policy_id": "Worker节点系统盘快照策略ID", "num_of_nodes": "Worker节点数", "snat_entry": "是否配置SNATEntry", "endpoint_public_access": "是否公网暴露集群endpoint", "cpu_policy": "static|none", "node_port_range": "节点端口范围,默认30000-65535", "proxy_mode": "网络模式, 可选值iptables|ipvs", "addons": "选装addon, 数组格式对象", "tags": "给集群打tag标签, 数组格式对象", "security_group_id": "安全组ID", "auto_snapshot_policy_id": "自动快照策略ID", "taints": "给节点添加taint, 数组格式对象", "deletion_protection":"是否开启集群删除保护,防止通过控制台或api误删除集群", "os_type":"运行pod的主机的操作系统类型,例如:linux,Windows等", "platform":"运行pod的主机的平台架构", "runtime":"容器运行时,默认为docker", } 表 1. 请求体解释 名称 类型 必须 描述 cluster_type string 是 集群类型。 key_pair string 是 keypair名称。和login_password二选一。 login_password string 是 SSH登录密码。密码规则为8 - 30 个字符,且至少同时包含三项(大小写字母、数字和特殊符号)。和key_pair 二选一。 master_instance_charge_type string 否 Master节点付费类型,可选值为: PrePaid:预付费 PostPaid:按量付费 默认为按量付费。 master_instance_types list 是 Master节点ECS规格类型代码。更多详细信息,参见实例规格族。 master_system_disk_category string 是 Master节点系统盘类型,取值范围是: cloud_efficiency:高效云盘。 cloud_ssd:SSD云盘。 master_system_disk_size int 是 Master节点系统盘大小,单位为GiB。 master_vswitch_ids list 是 Master节点交换机ID列表,交换机个数取值范围为1~3。为确保集群的高可用性,推荐您选择3个交换机,且分布在不同的可用区。 num_of_nodes int 是 Worker节点数。范围是[0,100]。 name string 是 集群名称, 集群名称可以使用大小写英文字母、中文、数字、中划线。 region_id string 是 集群所在地域ID。 snat_entry bool 是 是否为网络配置SNAT。 当已有VPC能访问公网环境时,设置为 false。 当已有VPC不能访问公网环境时: 设置为true,表示配置SNAT,此时可以访问公网环境。 设置为false,表示不配置SNAT,此时不能访问公网环境。 worker_instance_types list 是 Worker 节点 ECS 规格类型代码。更多详细信息,参见实例规格族。 worker_system_disk_category string 是 Worker节点系统盘类型。 worker_system_disk_size int 是 Worker节点系统盘大小,单位为GiB。 worker_vswitch_ids list 是 Worker节点的虚拟交换机 ID。 addons list 否 Kubernetes集群的addon插件的组合。 addons的参数: name:必填,addon插件的名称。 version:可选,取值为空时默认取最新版本。 config:可选,取值为空时表示无需配置。 网络插件:包含Flannel和Terway网络插件,二选一。 日志服务:可选,如果不开启日志服务时,将无法使用集群审计功能。 Ingress:默认开启安装Ingress组件。 container_cidr string 否 容器网段,不能和VPC网段冲突。当选择系统自动创建VPC时,默认使用172.16.0.0/16网段。 cloud_monitor_flags bool 否 是否安装云监控插件: true:表示安装。 false:表示不安装。。 cpu_policy string 否 CPU策略。集群版本为1.12.6及以上版本支持static 和 none两种策略。默认为none。 disable_rollback bool 否 失败是否回滚: true:表示失败不回滚。 false:表示失败回滚。 默认为true,如果选择失败回滚,则会释放创建过程中所生产的资源,不推荐使用false。 master_auto_renew bool 否 Master节点是否自动续费,当master_instance_charge_type取值为PrePaid时才生效,可选值为: true:自动续费。 false:不自动续费。 master_auto_renew_period int 否 自动续费周期,当选择预付费和自动续费时才生效,且为必选值。PeriodUnit=Month时,取值为{“1”, “2”, “3”, “6”, “12”}。 master_count int 否 Master实例个数,可选值3或者5。默认值为3。 master_data_disk(已弃用) bool 否 Master节点是否挂载数据盘,可选择为: true:挂载数据盘 false:不挂载数据盘,默认为false master_data_disks list 否 Master数据盘类型、大小等配置的组合。该参数只有在挂载Master节点数据盘时有效,包含以下参数: category:数据盘类型。取值范围: cloud:普通云盘 cloud_efficiency:高效云盘 cloud_ssd:SSD云盘 size:数据盘大小,单位为GiB。 encrypted: master_period int 否 包年包月时长,当master_instance_charge_type取值为PrePaid时才生效且为必选值,取值范围: PeriodUnit=Month时,Period取值:{ “1”, “2”, “3”,“6”,“12”}。 master_period_unit string 否 当指定为PrePaid的时候需要指定周期。Month:以月为计时单位。 node_port_range string 否 节点服务端口。取值范围为[30000,65535]。 proxy_mode string 否 kube-proxy 代理模式,支持 iptables 和 IPVS两种模式。 默认为 iptables 。 endpoint_public_access bool 否 是否开启公网API Server: true:默认为True,表示开放公网API Server。 false:若设置为false, 则不会创建公网的API Server,仅创建私网的API Server。 security_group_id string 否 指定集群ECS实例所属于的安全组ID。 service_cidr string 否 服务网段,不能和VPC网段以及容器网段冲突。当选择系统自动创建VPC时,默认使用172.19.0.0/20网段。 ssh_flags bool 否 是否开放公网SSH登录: true:表示开放。 false:表示不开放。 tags list 否 给集群打tag标签: key:标签名称。 value:标签值。 taints list 否 用于给节点做污点标记,通常用于 Pods 的调度策略。与之相对应的概念为:容忍(tolerance),若 Pods 上有相对应的 tolerance 标记,则可以容忍节点上的污点,并调度到该节点。 kubernetes_version string 否 Kubernetes集群版本,默认最新版。ACK支持的KubernetesK8s版本:v1.16.6,v1.14.6和v1.12.6。 timeout_mins int 否 集群资源栈创建超时时间,以分钟为单位,默认值 60。 vpcid string 否 VPC ID,可空。如果不设置,系统会自动创建VPC,系统创建的VPC网段为192.168.0.0/16。 说明 VpcId 和 vswitchid 只能同时为空或者同时都设置对应的值。 worker_auto_renew bool 否 是否开启Worker节点自动续费,可选值为: true:自动续费。 false:不自动续费。 worker_auto_renew_period int 否 自动续费周期,当选择预付费和自动续费时才生效,且为必选值: PeriodUnit=Month时,取值{“1”, “2”, “3”, “6”, “12”}。 worker_data_disk(已弃用) string 否 是否挂载数据盘,可选择为: true:表示worker节点挂载数据盘。 false:表示worker节点不挂载数据盘。 worker_data_disks list 否 Worker数据盘类型、大小等配置的组合。该参数只有在挂载Worker节点数据盘时有效,包含以下参数: category:数据盘类型。取值范围: cloud:普通云盘。 cloud_efficiency:高效云盘。 cloud_ssd:SSD云盘。 size:数据盘大小,单位为GiB。 encrypted:是否对数据盘加密,true|false。 worker_instance_charge_type string 否 Worker节点付费类型,可选值为: PrePaid:预付费。 PostPaid:按量付费。 默认为按量付费。 worker_period int 否 包年包月时长,当worker_instance_charge_type取值为PrePaid时才生效且为必选值,取值范围:PeriodUnit=Month时,Period取值:{ “1”, “2”, “3”, “6”, “12”}。 worker_period_unit string 否 当指定为PrePaid的时候需要指定周期。Month:以月为计时单位。 deletion_protection bool 否 是否开启集群删除保护,防止通过控制台或api误删除集群。 os_type string 否 运行pod的主机的操作系统类型,例如:linux,Windows等。 platform string 否 运行pod的主机的平台架构。 runtime json 否 容器运行时,一般为docker,包括2个信息:name和version。 node_cidr_mask string 否 节点网络的网络前缀。node_cidr_mask通过cidr限制一个节点上能运行容器网络的Pod数量。例如node_cidr_mask是24的话,对应的容器数量是256,25对应的就是128。计算方式:2^(node_cidr_mask的值-24)-1。 返回信息 返回行 ResponseLine HTTP/1.1 202 Accepted 特有返回头 ResponseHead 无,请参考公共返回头部。 表 2. 返回体 ResponseBody 名称 类型 描述 cluster_id string 集群实例ID。 request_id string 请求ID。 task_id string 任务ID。系统自动分配,用户查询任务状态。 示例 请求示例 POST /clusters HTTP/1.1 <公共请求头> { "cluster_type":"Kubernetes", "name":"my-test-Kubernetes-cluster", "region_id":"cn-beijing", "disable_rollback":true, "timeout_mins":60, "kubernetes_version":"1.12.6-aliyun.1", "snat_entry":true, "endpoint_public_access":false, "cloud_monitor_flags":false, "node_cidr_mask":"25", "proxy_mode":"iptables", "tags":[], "addons": [{"name": "flannel"},{"name": "aliyun-log-controller","config": "{"sls_project_name":"k8s-log-c64f6eab6a1764d3dbee3dc2b9e41****"}"},{"name": "nginx-ingress-controller", "config": "{"IngressSlbNetworkType":"internet"}"}], "node_port_range":"30000-32767", "login_password":"test****", "cpu_policy":"none", "master_count":3, "master_vswitch_ids":["vsw-2ze48rkq464rsdts****","vsw-2ze48rkq464rsdts1****","vsw-2ze48rkq464rsdts1****"], "master_instance_types":["ecs.sn1.medium","ecs.sn1.medium","ecs.sn1.medium"], "master_system_disk_category":"cloud_efficiency", "master_system_disk_size":40, "worker_instance_types":["ecs.sn2.3xlarge"], "num_of_nodes":3, "worker_system_disk_category":"cloud_efficiency", "worker_system_disk_size":120, "vpcid":"vpc-2zegvl5etah5requ0****", "worker_vswitch_ids":["vsw-2ze48rkq464rsdts****"], "container_cidr":"172.20.XX.XX/16", "service_cidr":"172.21.XX.XX/20", "worker_data_disks": [{"category": "cloud_ssd", "size": 500}], "master_data_disks": [{"category": "cloud_ssd", "size": 500}], "taints":[{"key": "special", "value": "true", "effect": "NoSchedule"}] } 返回示例 HTTP/1.1 202 Accepted <公共响应头> { "cluster_id": "cb95aa626a47740afbf6aa099b650****", "request_id": "687C5BAA-D103-4993-884B-C35E4314A1E1", "task_id": "T-5a54309c80282e39ea00002f" }

1934890530796658 2020-04-01 11:01:33 0 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SSL证书 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 2020中国云原生 阿里云云栖号