KVM虚拟机CPU绑定性能调优

Kvm
关于linux 进程的处理器亲和性的vCPU 隔离和绑定之前已经做过测试,查考 ubuntu中测试进程的处理器亲和性和vCPU的绑定。查看链接:Setting KVM processor affinities 那么KVM 虚拟化下如何直接为虚拟机绑定CPU ...
继续阅读 »
关于linux 进程的处理器亲和性的vCPU 隔离和绑定之前已经做过测试,查考 ubuntu中测试进程的处理器亲和性和vCPU的绑定。查看链接:Setting KVM processor affinities
那么KVM 虚拟化下如何直接为虚拟机绑定CPU 呢,KVM 提供了很方便的方法
查看所有虚拟机:
root@network:~# virsh list --all  
Id Name State
----------------------------------------------------
2 instance-000000ef running
4 instance-000000f3 running
7 instance-00000120 running
10 instance-00000146 running
11 instance-00000147 running
12 instance-00000148 running
26 instance-00000157 running
35 instance-0000015c running
38 instance-00000158 running
39 instance-0000015b running
- instance-00000122 shut off
查看虚拟机信息
root@network:~# virsh dumpxml instance-00000146  

instance-00000146
45d77d2b-723f-40c8-a953-13f886a317f8
4194304
4194304
4

/machine



OpenStack Foundation
OpenStack Nova
2014.1.3
202b2f9b-3fb8-dc11-8e76-e03f490e5d2c
45d77d2b-723f-40c8-a953-13f886a317f8


查看cvpu
root@network:~# ps -ef|grep instance-00000146  
root 21561 13180 0 14:31 pts/12 00:00:00 grep --color=auto instance-00000146
libvirt+ 31858 1 5 Jan08 ? 17:09:02 /usr/bin/qemu-system-x86_64 -name instance-00000146 -S -machine pc-i440fx-trusty,accel=kvm,usb=off -cpu Opteron_G5,+bmi1,+perfctr_nb,+perfctr_core,+topoext,+nodeid_msr,+tce,+lwp,+wdt,+skinit,+ibs,+osvw,+cr8legacy,+extapic,+cmp_legacy,+fxsr_opt,+mmxext,+osxsave,+monitor,+ht,+vme -m 4096 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 45d77d2b-723f-40c8-a953-13f886a317f8 -smbios type=1,manufacturer=OpenStack Foundation,product=OpenStack Nova,version=2014.1.3,serial=202b2f9b-3fb8-dc11-8e76-e03f490e5d2c,uuid=45d77d2b-723f-40c8-a953-13f886a317f8 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-00000146.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/disk.swap,if=none,id=drive-virtio-disk1,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,id=virtio-disk1 -netdev tap,fd=25,id=hostnet0,vhost=on,vhostfd=34 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:83:8e:cf,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -device usb-tablet,id=input0 -vnc 0.0.0.0:8 -k en-us -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
root@network:~# ps -eLo ruser,pid,ppid,lwp,psr|grep 31858
libvirt+ 31858 1 31858 0
libvirt+ 31858 1 31867 6
libvirt+ 31858 1 31869 4
libvirt+ 31858 1 31871 7
libvirt+ 31858 1 31873 0
libvirt+ 31858 1 31882 7
libvirt+ 31858 1 19834 6
libvirt+ 31858 1 20272 6
libvirt+ 31858 1 20679 6
libvirt+ 31858 1 20925 6
libvirt+ 31858 1 20926 6
libvirt+ 31858 1 20927 6
libvirt+ 31858 1 20928 7
libvirt+ 31858 1 20930 6
最后一列是cpu 的编号,重复执行 ps -eLo ruser,pid,ppid,lwp,psr|grep 31858  可以看到 线程是不停在不通cpu 上漂移的,绑定这么多线程是很麻烦的
利用 virsh vcpuinfo instance-00000146  查看每个vCPU 对应物理核心(也是浮动的)
root@network:~# virsh vcpuinfo instance-00000146  
VCPU: 0
CPU: 4
State: running
CPU time: 16025.9s
CPU Affinity: yyyyyyyy 这里看到是宿主机所有物理CPU 核心,Y代表有可以使用,基于CPU时间片来回切换


VCPU: 1
CPU: 6
State: running
CPU time: 20221.3s
CPU Affinity: yyyyyyyy

VCPU: 2
CPU: 6
State: running
CPU time: 12179.5s
CPU Affinity: yyyyyyyy

VCPU: 3
CPU: 5
State: running
CPU time: 12411.4s
CPU Affinity: yyyyyyyy
绑定instance-00000146 的vcpu0 到物理cpu3
root@network:~# virsh vcpupin instance-00000146 0 3  

root@network:~# virsh vcpuinfo instance-00000146
VCPU: 0
CPU: 3
State: running
CPU time: 16033.7s
CPU Affinity: ---y---- 这里看到只有第三个cpu 为Y

VCPU: 1
CPU: 1
State: running
CPU time: 20234.7s
CPU Affinity: yyyyyyyy

VCPU: 2
CPU: 0
State: running
CPU time: 12188.5s
CPU Affinity: yyyyyyyy

VCPU: 3
CPU: 0
State: running
CPU time: 12420.2s
CPU Affinity: yyyyyyyy
依次绑定
root@network:~# virsh vcpupin instance-00000146 1 4  

root@network:~# virsh vcpupin instance-00000146 2 5

root@network:~# virsh vcpupin instance-00000146 3 6

root@network:~# virsh vcpuinfo instance-00000146
VCPU: 0
CPU: 3
State: running
CPU time: 16050.3s
CPU Affinity: ---y----

VCPU: 1
CPU: 4
State: running
CPU time: 20255.6s
CPU Affinity: ----y---

VCPU: 2
CPU: 5
State: running
CPU time: 12203.2s
CPU Affinity: -----y--

VCPU: 3
CPU: 6
State: running
CPU time: 12438.0s
CPU Affinity: ------y-

收起阅读 »

KVM之初体验-手动及自动化安装

Kvm
一,什么是KVM KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式。用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hypervisor)的代码。由于这是一...
继续阅读 »


一,什么是KVM


KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式。用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hypervisor)的代码。由于这是一个新的处理器执行模型,代 码不需要任何的改动。   除了处理器状态转换,这个内核模块同样处理很小一部分低层次的模拟,比如MMU注册(用于管理VM)和一部分PCI模拟的硬件。 在可预见的未来,Qemu团队专注于硬件模拟和可移植性,同时KVM团队专注于内核模块(如果某些部分确实有性能提升的话,KVM会将一小部分模拟代码移 进来)和与剩下的用户空间代码的交互。 kvm-qemu可执行程序像普通Qemu一样:分配RAM,加载代码,不同于重新编译或者调用calling KQemu,它创建了一个线程(这个很重要);这个线程调用KVM内核模块去切换到用户模式,并且去执行VM代码。当遇到一个特权指令,它从新切换会 KVM内核模块,该内核模块在需要的时候,像Qemu线程发信号去处理大部分的硬件仿真。 这个体系结构一个比较巧妙的一个地方就是客户代码被模拟在一个posix线程,这允许你使用通常Linux工具管理。如果你需要一个有2或者4核的虚拟 机,kvm-qemu创建2或者4个线程,每个线程调用KVM内核模块并开始执行。并发性(若果你有足够多的真实核)或者调度(如果你不管)是被通用的 Linux调度器,这个使得KVM代码量十分的小 当一起工作的时候,KVM管理CPU和MEM的访问,QEMU仿真硬件资源(硬盘,声卡,USB,等等)当QEMU单独运行时,QEMU同时模拟CPU和 硬件。


二、KVM架构


kvm基本结构有2个部分构成:
    [] kvm 驱动,现在已经是linux kernel的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU寄存器的读写以及VCPU的运行。[/][]另个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。[/]

kvm.jpg


三、KVM 工作原理


kvm基本工作原理概述:
用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块未虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模 式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。
如下图所示:
kvmlc.png


四、手动安装配置KVM


1.安装前的准备
1.CPU支持虚拟化(Inter-VT、AMD-V)
[root@localhost ~]# grep --color 'svm|vmx|lm' /proc/cpuinfo

相关CPU功能标志包括:
svm=安全虚拟机(AMD-V)
vmx=虚拟机x86(Inter-VT)
lm=长模式(64位支持)

2. BIOS开启CPU虚拟化支持
1)重启
2)按delete键
3) 进入BIOS开启  
2.安装虚拟化(yum配置完毕)
# yum -y install kvm python-virtinst libvirt bridge-utils
virt-manager qemu-kvm-tools virt-viewer virt-v2v qemu-kvm tunctl
[root@localhost ~]#vim /etc/sysconfig/selinux //关闭selinux
SELINUX=disabled

3.启动libvirtd
[root@localhost ~]# /etc/init.d/libvirtd start //启动
[root@localhost ~]# ps -e|grep libvirtd //查看是否启动
[root@localhost ~]#chkconfig libvirtd on
注释:永久开启!不然系统重启后不会自动启动这个服务的哟~
# virsh iface-bridge eth0 br0
注释:创建网络桥!
验证:
ifconfig br0
注释:观察IP地址是否跑到了br0网卡上! 
4.配置网络桥接
root@localhost network-script]# vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br0

[root@localhost network-scripts]# vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
DNS1=192.168.0.1
DELAY=0

5.重启网络
[root@localhost]# service NetworkManager stop //这个关闭掉就行
停止 NetworkManager 守护进程: [确定]
注释:为什么关闭它呢~因为它和KVM桥接网卡冲突!
#chkconfig NetworkManager off
注释:永久关闭该服务!!!不然系统重启后还会自己再把这个服务开启的哟~
[root@localhost rules.d]# service network restart


6.用virt-install生成.img文件(参数含义在上一篇KVM初体验已有注释)
# virt-install --name=ubuntu1
--ram 1024 --vcpus=1
--disk path=/root/ubuntu1.img,size=10
--accelerate --cdrom /root/redhat6.4.iso
--graphics vnc,port=5920 --network bridge=br0
[root@localhost ~]# vi /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
user = "root" //去掉注释
group = "root" //去掉注释
dynamic_ownership = 0 //去掉注释,把1改为0

7.启动虚拟机
虚拟机使用方法:
virsh destroy 虚拟机名 #关闭虚拟机
virsh undefine 虚拟机名 #删除虚拟机
virsh start 虚拟机名 #开启虚拟机
virsh list --all 显示所有虚拟机
virsh console 虚拟机名 #连接虚拟机
手动安装完毕,现在就可以在命令行里秀操作了。


五、自动化脚本安装KVM


#!/bin/bash
echo "[1] 配置YUM"
echo "[2] 安装KVM工具"
echo "[3] 设置桥接"
echo "[4] 手动安装虚拟机"
echo "[5] 查看虚拟机"
echo "[6] 开启虚拟机"
echo "[7] 关闭虚拟机"
echo "[8] 连接虚拟机"
echo "[9] 自动安装虚拟机"
echo "[0] 退出"
read -p "type:" NUM
if [ $NUM = 0 ];then
exit;
elif [ $NUM = 1 ];then
#配置YUM
rm -rf /etc/yum.repos.d/*;
cat > /etc/yum.repos.d/yum.repo << EOF
[yum]
name=yum
enabled=1
gpgcheck=0
baseurl=ftp://192.168.0.200/rhel6.4
EOF
elif [ $NUM = 2 ];then
#安装KVM工具
LANG=en yum groupinstall "Virtualization*" -y;
elif [ $NUM = 3 ];then
#设置桥接
chkconfig NetworkManager off;
chkconfig network on;
service NetworkManager stop;
service network start;
yum install "bridge-utils" -y;
service libvirtd restart;
chkconfig libvirtd on;
virsh iface-bridge eth0 br0;
elif [ $NUM = 4 ];then
#安装虚拟机
read -p "输入虚拟机的名字:" NAME
read -p "输入虚拟及硬盘大小(G): " SIZE
read -p "输入虚拟机内存大小(M): " MEM
ping -c 1 192.168.0.200 > /dev/null
if [ $? -ne 0 ];then
echo "无法接连192.168.0.200,请检查网络!";
exit;
fi
virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/images/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://172.16.8.100/rhel6.4 -x " console=ttyS0";
elif [ $NUM = 5 ];then
#查看虚拟机
virsh list --all
elif [ $NUM = 6 ];then
#开机
read -p "虚拟机名称: " XNAME
virsh start $XNAME;
elif [ $NUM = 7 ];then
#关闭
read -p "虚拟机名称: " XNAME &> /dev/null
virsh destroy $XNAME;
elif [ $NUM = 8 ];then
#连接虚拟机
read -p "虚拟机名称: " XNAME
virsh console $XNAME;
elif [ $NUM = 9 ];then
#自动安装虚拟机
read -p "输入虚拟机的名字:" NAME
read -p "输入虚拟及硬盘大小(G): " SIZE
read -p "输入虚拟机内存大小(M): " MEM
ping -c 1 192.168.0.200 > /dev/null
if [ $? -ne 0 ];then
echo "无法接连192.168.0.200,请检查网络!";
exit;
fi
virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/images/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://192.168.0.200/rhel6.4 -x "ks=ftp://192.168.0.200/rhel6.4.ks console=ttyS0";


else
echo "请输入:0~4数字!";
fi
注:此脚本已基本实现KVM自动化安装的基本功能。


总结


其实KVM的安装和使用都很方便简单的,大家要理解KVM各个参数的含义。最关键的就是KVM的网络桥接的设置,但是现在KVM在某些方面还是有一定的缺陷(比如创建光驱要关机等),希望会在后续版本中有所改进,在这里大家要多看官方软件自身的文档,会有很大的帮助。


分享原文地址:http://5323197.blog.51cto.com/5313197/1738805


收起阅读 »

Cpu/Memory/IO虚拟化详解

一、定义 虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。虚拟化技术可以扩大硬件的容量,简...
继续阅读 »


一、定义


虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。


二、虚拟化的类别


虚拟化的类别有很多,定义也很宽泛;无法做到全面详述。这里将简单说明:
1、模拟:emulation(底层和模拟架构不需要一致);通过软件模拟是需要模拟环Ring0/1/2/3层;但是性能差;所以使用相对较少。
硬件 ---> Host ---> VMM(emulation) ---> Virtulization host
vt1.png
2、完全虚拟化(full-virtualization):只虚拟出环ring0(以CPU虚拟化来说明)

    []BT:二进制翻译技术(Binary Translate);将模拟的CPU直接翻译成特权指令;限定虚拟结构平台和底层物理架构必须保持一致。基于软件的完全虚拟化。[/][]优点:不用修改GuestOS内核可以直接使用;应用广泛。[/][]缺点:在VMM捕获特权指令和翻译过程会导致性能的下降。[/]
vt2.png
    []硬件辅助虚拟化:5个指令环;在环0的底层加了环-1;环0的特权指令给了环-1;HVM(hardware virtulization machine);属于硬件的完全虚拟化。[/]
vt3.png
3、半虚拟化(para-virtulization):Guest明确知道自己运行在虚拟机上;;在执行特权指令时直接向hyper call调用;省去了特权指令的翻译过程。
    []优点:相对完全虚拟化;性能高;省去了特权指令的翻译过程。[/][]缺点:需要对GuestOS内核的修改;应用有限制。[/]
vt4.png
4、OS级别的虚拟化:硬件-->OS kernel-->多个用户空间
vt5.png
5、库虚拟化:wine
6、应用程序虚拟化:jvm
虚拟化的实现方式两种类型:
    []Type-I:Hypervisor;在虚拟机的管理上更加的彻底和可靠。[/][]Type-II:宿主机运行在硬件上;可以依赖宿主机的各种管理软件进行虚拟机管理。[/]
 
vt6.png

三、内存(Memory)虚拟化

内存虚拟化是虚拟机实现中的重要部分。在虚拟机中,虚拟出来的Guest OS和Host OS用的是相同的物理内存,却不能让它们相互影响到。如果OS在物理机上运行,只要OS提供页表,MMU会在访存时自动做虚拟地址(Virtual address, VA)到物理地址(Physical address, PA)的转化。而如果虚拟机上运行时,Guest OS经过地址转化到的“物理地址”并不是真实物理内存上的地址(GVA-->GPA),因此还需要使用软件将其转化为真实物理内存地址(HPA)。也就是说Guest OS要访问VA需要经过GVA-->GPA-->HPA的转化。
    []MMU Virtualization[/]
Guest完成GVA-->GPA第一层转化,硬件同时完成GPA到HPA这第二层转化。第二层转化对于Guest OS来说是透明的。Guest OS访问内存时和在物理机运行时是相同的,所以可以实现全虚拟化。这种特性Intel和AMD都有支持。Intel称之为Extended Page Tables (EPT),AMD称之为Nested Page Tables (NPT)。其优点是hypervisor节省了工作,缺点是需要硬件支持。
    []TLB Virtualization:tagged TLB[/]
TLB:转换后援存储器;原生只存储VA-->PA的对应关系。所以在虚拟内存中的两次转换会导致TLB的命中率失效。致使性能降低。所以使用tagged TLB,它缓存了Guest对象和GVA-->HPA的对应关系。需要CPU的支持。

四、I/O虚拟化的方式

    []模拟(完全虚拟):完全使用软件来模拟真实硬件;模拟通常硬件;例如键盘鼠标;通过焦点捕获;焦点被哪个主机捕获就被哪个主机使用。性能很差。[/][]半虚拟化:对硬件驱动由前端(IO frontend)直接转到后端(IO backend)调用;通常仅适用于硬盘和网卡。性能高。[/][]IO-through:IO透传;直接分配给虚拟机物理设备;例如直接分配一个硬盘或网卡给虚拟机;需要硬件具备IO透传技术;在Xen下由Dom0分配;但是访问使用直接使用;不经过Dom0。需要硬件支持。[/]
I/O具体工作模式:
v7.png
VMM:对IO的驱动有三种模式:
    []自主VMM:由VMM自行提供驱动和控制台;[/][]混合VMM:借助于OS提供驱动;[/]
                              依赖于外部OS实现特权域                              自我提供特权域
    []寄宿式VMM:[/]


五、虚拟化网络


bridge:把原宿主机上的网卡当交换机;然后虚拟出一个桥来接收发往宿主机的数据包。
vm8.png

isolation mode:仅guest之间通信;不与外部网络和宿主机通信。
v9.png

routed mode:与外部主机通信;依赖于静态路由指定到各Guest需经过pnet0。
host-only:不与外部主机通信。
vt10.png

nat:地址转换;在虚拟网卡和物理网卡之间建立一个nat转发服务器;对数据包进行源地址转换。
vt11.png

到此基本虚拟化基础以详解完成。


分享阅读原文:http://www.toxingwang.com/cloud/2885.html


收起阅读 »

服务器磁盘只读修复过程记录

服务器的磁盘也没有做监控,其实我也不知道如何对磁盘的状态做监控,突然查看不到新数据,上去看了一下磁盘的情况,发现磁盘出现只读的情况,无法写入数据,后续研究一下怎么可以监控磁盘只读的方法。 处理过程 1、磁盘坏道检查 出现问题之后,首先把业务停掉了,然后把磁...
继续阅读 »
服务器的磁盘也没有做监控,其实我也不知道如何对磁盘的状态做监控,突然查看不到新数据,上去看了一下磁盘的情况,发现磁盘出现只读的情况,无法写入数据,后续研究一下怎么可以监控磁盘只读的方法。


处理过程


1、磁盘坏道检查
出现问题之后,首先把业务停掉了,然后把磁盘卸载掉来进行修复,出现这种问题有可能是磁盘的磁道有坏区,我首先检查了一下磁盘坏道的情况。
badblocks -sv /dev/sdb
差不多检查了一些时间,发现并没有坏道。
 
2、修复磁盘文件系统
在修复文件系统的时候发现无法修复,提示Superblock invalid。
[root@ad4 ~]# fsck -t ext4 /dev/sdb
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/sdb
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
3、查看文件系统备份Superblock
[root@ad4 ~]# mke2fs -n /dev/sdb         
mke2fs 1.41.12 (17-May-2010)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1 blocks, Stripe width=0 blocks
122093568 inodes, 488364854 blocks
24418242 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
14904 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
4、修复文件系统
e2fsck -b 214990848 -y /dev/sdb
出现了很多修复的东西,修复了一会
disk1.png

 修复好之后,挂载进去目录查看如下
disk2.png

好歹只是丢失了文件夹的名称,剩下的回复交由DBA来进行操作。


分享阅读原文:http://wangzan18.blog.51cto.com/8021085/1739473


收起阅读 »

浅谈堡垒机概念和工作原理

摘要 在信息化社会,企事业单位业务对信息系统高度依赖,而信息系统维护人员往往拥有系统最高管理权限,其操作行为必须得到有效监管与审计。作为运维操作审计最佳解决方案的堡垒机通常会给人一种神秘莫测的感觉,为了让大家更清楚的了解堡垒机和运维操作审计,本文对堡垒机的...
继续阅读 »


摘要


在信息化社会,企事业单位业务对信息系统高度依赖,而信息系统维护人员往往拥有系统最高管理权限,其操作行为必须得到有效监管与审计。作为运维操作审计最佳解决方案的堡垒机通常会给人一种神秘莫测的感觉,为了让大家更清楚的了解堡垒机和运维操作审计,本文对堡垒机的概念及主要工作原理进行简要分析。


前言


当今的时代是一个信息化社会,信息系统已成为各企事业单位业务运营的基础,由于信息系统运维人员掌握着信息系统的最高权限,一旦运维操作出现安全问题将会给企业或单位带来巨大的损失。因此,加强对运维人员操作行为的监管与审计是信息安全发展的必然趋势。在此背景之下,针对运维操作管理与审计的堡垒机应运而生。堡垒机提供了一套多维度的运维操作控管控与审计解决方案,使得管理人员可以全面对各种资源(如网络设备、服务器、安全设备和数据库等)进行集中账号管理、细粒度的权限管理和访问审计,帮助企业提升内部风险控制水平。


堡垒机概念和种类


"堡垒"一词的含义是指用于防守的坚固建筑物或比喻难于攻破的事物,因此从字面的意思来看"堡垒机"是指用于防御攻击的计算机。在实际应用中堡垒机又被称为"堡垒主机",是一个主机系统,其自身通常经过了一定的加固,具有较高的安全性,可抵御一定的攻击,其作用主要是将需要保护的信息系统资源与安全威胁的来源进行隔离,从而在被保护的资源前面形成一个坚固的"堡垒",并且在抵御威胁的同时又不影响普通用户对资源的正常访问,堡垒机还集成了行为审计和权限控制,从而加强了堆操作和安全的控制。
基于其应用场景,堡垒机可分为两种类型:
1、网关型堡垒机
网关型的堡垒机被部署在外部网络和内部网络之间,其本身不直接向外部提供服务而是作为进入内部网络的一个检查点,用于提供对内部网络特定资源的安全访问控制。这类堡垒机不提供路由功能,将内外网从网络层隔离开来,因此除非授权访问外还可以过滤掉一些针对内网的来自应用层以下的攻击,为内部网络资源提供了一道安全屏障。但由于此类堡垒机需要处理应用层的数据内容,性能消耗很大,所以随着网络进出口处流量越来越大,部署在网关位置的堡垒机逐渐成为了性能瓶颈,因此网关型的堡垒机逐渐被日趋成熟的防火墙、UTM、IPS、网闸等安全产品所取代。
2、运维审计型堡垒机
第二种类型的堡垒机是审计型堡垒机,有时也被称作"内控堡垒机",这种类型的堡垒机也是当前应用最为普遍的一种。
运维审计型堡垒机的原理与网关型堡垒机类似,但其部署位置与应用场景不同且更为复杂。运维审计型堡垒机被部署在内网中的服务器和网络设备等核心资源的前面,对运维人员的操作权限进行控制和操作行为审计;运维审计型堡垒机即解决了运维人员权限难以控制混乱局面,又可对违规操作行为进行控制和审计,而且由于运维操作本身不会产生大规模的流量,堡垒机不会成为性能的瓶颈,所以堡垒机作为运维操作审计的手段得到了快速发展。
最早将堡垒机用于运维操作审计的是金融、运营商等高端行业的用户,由于这些用户的信息化水平相对较高发展也比较快,随着信息系统安全建设发展其对运维操作审计的需求表现也更为突出,而且这些用户更容易受到 "信息系统等级保护"、"萨班斯法案"等法规政策的约束,因此基于堡垒机作为运维操作审计手段的上述特点,这些高端行业用户率先将堡垒机应用于运维操作审计。
随着互联网的快速发展,web 2.0快速化和互联网公司运维人员对编程技能的掌握程度越来越重要,互联网公司安全意思越来越强,好多公司都已经开发使用堡垒机,作为权限控制和运维行为审计。


堡垒机运维操作审计的工作原理


作为运维操作审计手段的堡垒机的核心功能是用于实现对运维操作人员的权限控制与操作行为审计。
1、主要技术思路
如何实现对运维人员的权限控制与审计呢?堡垒机必须能够截获运维人员的操作,并能够分析出其操作的内容。堡垒机的部署方式,确保它能够截获运维人员的所有操作行为,分析出其中的操作内容以实现权限控制和行为审计的目的,同时堡垒机还采用了应用代理的技术。
运维审计型堡垒机对于运维操作人员相当于一台代理服务器(Proxy Server),其工作流程示意图如下所示:
blj.png

    []运维人员在操作过程中首先连接到堡垒机,然后向堡垒机提交操作请求;[/][]该请求通过堡垒机的权限检查后,堡垒机的应用代理模块将代替用户连接到目标设备完成该操作,之后目标设备将操作结果返回给堡垒机,最后堡垒机再将操作结果返回给运维操作人员。[/]

 
通过这种方式,堡垒机逻辑上将运维人员与目标设备隔离开来,建立了从“运维人员->堡垒机用户账号->授权->目标设备账号->目标设备”的管理模式,解决操作权限控制和行为审计问题的同时,也解决了加密协议和图形协议等无法通过协议还原进行审计的问题。
2、工作原理简介
下面就简单介绍一下堡垒机运维操作审计的工作原理,其工作原理示意图如下:
bljlj.png
在实际使用场景中堡垒机的使用人员通常可分为管理人员、运维操作人员、审计人员三类用户。
管理员最重要的职责是根据相应的安全策略和运维人员应有的操作权限来配置堡垒机的安全策略。堡垒机管理员登录堡垒机后,在堡垒机内部,“策略管理”组件负责与管理员进行交互,并将管理员输入的安全策略存储到堡垒机内部的策略配置库中。
"应用代理"组件是堡垒机的核心,负责中转运维操作用户的操作并与堡垒机内部其他组件进行交互。"应用代理"组件收到运维人员的操作请求后调用“策略管理”组件对该操作行为进行核查,核查依据便是管理员已经配置好的策略配置库,如此次操作不符合安全策略“应用代理”组件将拒绝该操作行为的执行。
运维人员的操作行为通过"策略管理"组件的核查之后"应用代理"组件则代替运维人员连接目标设备完成相应操作,并将操作返回结果返回给对应的运维操作人员;同时此次操作过程被提交给堡垒机内部的"审计模块",然后此次操作过程被记录到审计日志数据库中。
最后当需要调查运维人员的历史操作记录时,由审计员登录堡垒机进行查询,然后“审计模块”从审计日志数据库中读取相应日志记录并展示在审计员交互界面上。


如何选择一款好的堡垒机产品


对于信息系统的管理者来说除了工作原理以外可能更关心如何选择一款好的运维审计堡垒机产品。一个好的运维审计堡垒机产品应实现对服务器、网络设备、安全设备等核心资产的运维管理账号的集中账号管理、集中认证和授权,通过单点登录,提供对操作行为的精细化管理和审计,达到运维管理简单、方便、可靠的目的。
1、管理方便
应提供一套简单直观的账号管理、授权管理策略,管理员可快速方便地查找某个用户,查询修改访问权限;同时用户能够方便的通过登录堡垒机对自己的基本信息进行管理,包括账号、口令等进行修改更新。
2、可扩展性
当进行新系统建设或扩容时,需要增加新的设备到堡垒机时,系统应能方便的增加设备数量和设备种类。
3、精细审计
针对传统网络安全审计产品无法对通过加密、图形运维操作协议进行为审计的缺陷,系统应能实现对RDP、VNC、X-Window、SSH、SFTP、HTTPS等协议进行集中审计,提供对各种操作的精细授权管理和实时监控审计。
4、审计可查
可实时监控和完整审计记录所有维护人员的操作行为;并能根据需求,方便快速的查找到用户的操作行为日志,以便追查取证。
5、安全性
堡垒机自身需具备较高的安全性,须有冗余、备份措施,如日志自动备份等
6、部署方便
系统采用物理旁路,逻辑串联的模式,不需要改变网络拓扑结构,不需要在终端安装客户端软件,不改变管理员、运维人员的操作习惯,也不影响正常业务运行。


总结


上面简要分析了堡垒机的概念以及其运维操作审计的主要工作原理。随着信息安全的快速发展,来自内部的安全威胁日益增多,综合防护、内部威胁防护等思想越来越受到重视,而各个层面的政策合规,如“萨班斯法案”、“信息系统等级保护”等等也纷纷对运维人员的操作行为审计提出明确要求。堡垒机作为运维安全审计产品将成为信息系统安全的最后一道防线,其作用也将越来越重要,应用范围势必会快速扩展到各个行业的信息系统。因此在当前的形势之下,让大家更加清楚的了解堡垒机也就十分必要了。

收起阅读 »

上G大文件双机互传工具BBCP

原由 局域网双机拷贝单个大文件 【200G大小】,不要问我是啥! 也不要问我为毛会生成那么大的单文件,事实就是这样!然后就开始了操蛋之旅!再次做下记录备忘! 方法尝试对比 方式一:scp什么是scp: scp 命令是 SSH中最方便有用的命令了,scp...
继续阅读 »


原由


局域网双机拷贝单个大文件 【200G大小】,不要问我是啥! 也不要问我为毛会生成那么大的单文件,事实就是这样!然后就开始了操蛋之旅!再次做下记录备忘!


方法尝试对比


方式一:scp
什么是scp: scp 命令是 SSH中最方便有用的命令了,scp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证。 与rcp 不同的是,scp 在需要进行验证时会要求你输入密码或口令。
速度:刚开始的时候33M/s 持续3分钟左右就跌落到3M左右的传输速度
方式二:rsync
什么是rsync: rsync是rcp的替代品之一,rsync 是一款高效的远程数据备份和镜象工具,
速度:无响应
方式三:wget
什么是wget: wget 是一个经由 GPL 许可的可从网络上自动获取文件的自由软件包。它是一个非交互式的命令行工具。支持 HTTP,HTTPS 和 FTP 协议,支持代理服务器以及断点续传功能。 wget 可实现递归下载,即可跟踪 HTML 页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构,实现远程网站的镜像。在递归下载时,wget 将页面中的超级链接转换成指向本地文件,方便离线浏览。由于非交互特性,wget 支持后台运行,用户在退出系统后,仍可继续运行。功能强大,设置方便简单。
速度:刚开始的时候50M/s 持续3分钟左右就跌落到3M左右的传输速度
方式四:bbcp
什么是bbcp: bbcp 是由SLAC(斯坦福直线加速器中心)的Andy Hanushevsky创立的点对点网络文件拷贝工具。经过简单测试,发现速度比 scp 快了10倍左右,因此推荐大家采用bbcp来取代scp等老家伙 :)
速度:针对20G的文件进行了测试,测试下来平均下来速度在21M左右,耗时16分钟
附图为2G文件的传输速度:
bbcp.jpg


总结


不同的应用场景使用不同的工具,单个大文件个人感觉bbcp还是极好极好的!
安装bbcp【两端都要安装】
wget http://www.slac.stanford.edu/~abh/bbcp/bin/amd64_rhel60/bbcp -O /usr/bin/bbcp
chmod +x /usr/bin/bbcp
来自http://heylinux.com/archives/2984.html的中文参数解释:
-k 保留所有未传输完成的文件,并允许在重试时进行覆盖
-a 保留checkpoint信息用于校验文件的完整性
-r 递归传输指定路径下的所有文件
-P 2 每两秒显示传输的进程
-V 打印调试信息
-f 强制清除远程主机上传输失败的数据
-w 设置Disk (I/O) buffers
算法为(window = netspeed/8[i]RTT = 1000Mb/8[/i]74ms = 1000/1000/8*74 = 9.25 M)
对应链接:http://www.slac.stanford.edu/~abh/bbcp/#_Toc332986061
-s 16 设置并发数为16
参考官方建议:http://www.slac.stanford.edu/~abh/bbcp/#_Streams_(-s)
-T "ssh -x -a -p 2222 -oFallBackToRsh=no -i /home/dong.guo/.ssh/id_rsa -l heydevops heylinux.com /usr/bin/bbcp"
指定远端主机的认证方式:
采用-p 2222指定端口;
设置-oFallBackToRsh=no减少ssh响应时间;
设置-i /home/dong.guo/.ssh/id_rsa指定SSH Key;
设置-l heydevops指定登陆用户;
heylinux.com为远程主机地址;
/usr/bin/bbcp为远程主机的bbcp路径;
参考文档:


http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htm 
http://heylinux.com/archives/2984.html 
http://imysql.cn/2008_12_08_using_bbcp_instead_scp 
http://linux.cn/article-4527-1-rss.html 
http://teachmyself.blog.163.com/blog/static/188814229201242314917237/
阅读分享原文:http://www.dwz.cn/2D55vI


收起阅读 »

解码IDC

什么是IDC IDC即是Internet Data Center,是为集中式收集、存储、处理和发送数据的设备提供运行维护的设施以及相关的服务体系,通俗来讲,IDC就是机房。 IDC提供的主要业务包括主机托管(机位、机架、VIP机房出租)、资源出租(如虚拟...
继续阅读 »


什么是IDC


IDC即是Internet Data Center,是为集中式收集、存储、处理和发送数据的设备提供运行维护的设施以及相关的服务体系,通俗来讲,IDC就是机房。

IDC提供的主要业务包括主机托管(机位、机架、VIP机房出租)、资源出租(如虚拟主机业务、数据存储服务)、系统维护(系统配置、数据备份、故障排除服务)、管理服务(如带宽管理、流量分析、负载均衡、入侵检测、系统漏洞诊断),以及其他支撑、运行服务等。



什么是ISP和ICP


ISP:
ISP的英文是Internet Service Provider,翻译为互联网服务提供商,即向广大用户综合提供互联网接入业务、 信息业务、和增值业务的电信运营商。像我们熟知的中国电信,之前的中国网通现在的新联通,中国移动,中国铁通等等,都是主要的ISP运营商。
ICP:
ICP的英文是Internet Content Provider,翻译为互联网内容提供商,即向广大用户综合提供互联网信息业务和 增值业务的电信运营商。一般网站都应该算为ICP运营商,这也是为什么我们常有需要ICP备案,而ICP在国内也分为商业ICP和非商业ICP。


什么是带宽独享和共享


顾名思义,独享带宽,就好比该线路是您服务器的专用高速公路,线路上传输的只有您自己服务器的数据,当然传输的量有一定限制,是根据用户要求来配备,一般是以100M为一个递增单位;而共享带宽,就是说有多台服务器在共同享受这条线路,线路上除了您,还有其他用户服务器的数据传输。
独享与共享各自的优、缺点?
独享带宽
    []优点:可自由使用带宽量,能保证速度和网络质量;[/]
  • 缺点:费用昂贵,一般100M的独享带宽,每月费用从上万到数万不等;
共享带宽
    []优点:价格比独享方式低廉不少,并且可以实现同线路上的高速资源共享;[/][]缺点:速度相对较低且不稳定,传输速率随线路上网络数据传输运行状态而有所变化;[/]

What VPS/虚拟主机

VPS是利用VPS(Virtual Private Server)技术,在一台服务器上创建多个相互隔离的虚拟专用服务器的优质服务。每个VPS的运行和管理都与一台独立主机完全相同,都可分配独立公网IP地址、独立操作系统Windows/Linux、独立超大空间、独立内存、独立CPU资源、独立执行程序和独立系统配置等。用户除了可以分配多个虚拟主机及无限企业邮箱外,更具有独立服务器功能,可自行安装程序,单独重启服务器,总而言之,VPS是一项具备高弹性、高质量及低成本效益的服务器解决方案。
虚拟主机(Virtual Host Virtual Server)是使用特殊的软硬件技术,把一台计算机主机分成一台台“虚拟”的主机,每一台虚拟主机都具有独立的域名和IP地址(或共享的IP地址),具有完整的Internet服务器功能。

云时代IDC运营商面临的挑战

业务:[list=1][]同质、低价、低水平的无序竞争,缺乏增值业务;[/][]缺乏灵活的运营模式和技术架构,业务创新困难;[/][]运营商面临转型:"卖资源" ->  "卖服务" ->  "卖能力"[/]成本:[list=1][]庞杂的设备,每天都会产生巨额的财务成本[/][]各类业务系统结构复杂重复,服务器、存储设备的无序扩张[/][]人力成本[/]能耗:[list=1][]设备以专用方式分配,产生资源孤岛,机器利用率低[/][]按传统设计方式,无论运营商业务量有多大,设备始终运行,导致其设备始终按最大容量耗电[/]管理:[list=1][]缺乏完善的流程定义,当前多采用人工方式,缺少相应的平台支持[/][]资源管理缺乏自动化,大量人力资源耗费在繁重的重复性工作上,无法关注业务发展和服务质量[/]


企业节能减排需求


jnjp.png


引入云计算的新一代IDC


nidc.png


IDC融合架构组件


idcarch.png


云计算对运营商的影响- IT技术架构


 云计算将促使运营商的IT技术架构将从分散、独立、非标准的IT系统转变为集中、共享、标准的云服务
idc_change.png


IDC未来


IDC_Future.png
收起阅读 »

Elasticsearch的monitor.jvm垃圾回收日志分析

 Elasticsearch更名为Elastic后,Kibana、Sense等一大票工具不再免费了 (具体价格可以参见 -Subscriptions),让人有点伤心。呵呵,毕竟是个好项目,人家也要挣钱去养家糊口,希望之后的版本能够更稳定,特别是在系统升级的稳定...
继续阅读 »
 Elasticsearch更名为Elastic后,Kibana、Sense等一大票工具不再免费了 (具体价格可以参见 -Subscriptions),让人有点伤心。呵呵,毕竟是个好项目,人家也要挣钱去养家糊口,希望之后的版本能够更稳定,特别是在系统升级的稳定性方面。最近刚将生产环境由1.2.2升级到 1.5.2,相对上一次1.1.1到1.2.2,这次总体还是平稳的,但还是有些意料之外的问题 - checksum check。
ES.png

       Elasticsearch是构建在Java之上的、开源的、分布式搜索和分析引擎,因此JVM的性能对Elasticsearch性能至关重要。在负载超出节点所能承受的情况下,JVM垃圾内存回收的“Stop-The-World”会造成节点被踢出Elasticsearch集群。如果只是偶尔发生,Elasticsearch的冗余设计可以克服(如: Replica # = 1)。但如果是经常出现节点被踢出的情况,则会对整个集群的稳定造成很致命的影响,很可能会造成数据的丢失,这就需要认真排查一下节点被踢出的原因。
       如果是因为JVM的“Stop-The-World”造成的,则在Elasticsearch的日志中一定可以看到[monitor.jvm ]日志。根据程度不同,它分为 INFO, WARN和DEBUG。下面是一些笔者遇到过的例子:


Example 1


[2016-01-11 14:09:52,783][INFO ][monitor.jvm             ] [ES-DIAG2-16-data] [gc][young][3402090][244044] duration [887ms],collections [1]/[1.5s], total [887ms]/[3.3h], memory [4.5gb]->[4gb]/[6.9gb],all_pools {[young] [499.4mb]->[782.8kb]/[532.5mb]}{[survivor][32.7mb]->[30.2mb]/[66.5mb]}{[old] [3.9gb]->[3.9gb]/[6.3gb]}
上面这个例子的情况无须紧张,只是young gc,并且只用了887ms,对于Elasticsearch而言,没有啥影响。唯一需要留心的是,如果在日志中出现连续的和长时间的young gc,则需要引起警觉,可能是你的Heap内存分配不够。


Example 2


[2016-01-11 15:54:14,630][WARN][monitor.jvm             ] [ES-DIAG-35-data] [gc][old][76581][22] duration [3.1m], collections[2]/[3.1m], total [3.1m]/[3.1m], memory [3gb]->[1.2gb]/[3.4gb], all_pools{[young] [251mb]->[74.9mb]/[266.2mb]}{[survivor][25.8mb]->[0b]/[33.2mb]}{[old] [2.8gb]->[1.1gb]/[3.1gb]}
如果这种JVM出现,则你的节点一定被踢出了集群。old gc是比较耗时,上面这个例子用了3.1分钟,一定是出了啥大事,要不是然“世界”不会停转这么久的,呵呵!


Example 3


[2016-01-11 17:33:33,287][WARN][monitor.jvm             ] [ES-DIAG-X-master] [gc][old][160117][1326] duration [41.4s], collections [2]/[42.4s],total [41.4s]/[4.7h], memory [3.4gb]->[3.4gb]/[3.4gb], all_pools {[young][266.2mb]->[266.2mb]/[266.2mb]}{[survivor][33.2mb]->[33.2mb]/[33.2mb]}{[old] [3.1gb]->[3.1gb]/[3.1gb]}
       这个例子相对于例-2而言更为严重,虽然old gc只让“世界”停了41.4秒,但gc之后,young,survivor和old都已经没有有可用的内存空间了。这种情况发生时,你会看到日志中满满的都是这样的日志,也一定会有 "java.lang.OutOfMemoryError: Java heap space"相伴。你摊上事儿了,摊上大事儿了,呵呵!
 
       一般情况下造成JVM "Stop-The-World"的原因是由于heap内存分配不够,适当的增加内存可以解决问题。当然也不是heap内存越大越好,32GB是个极限,超过这个极限性能反而会下降,具体请参阅Limiting Memory Usage Heap: Sizing and Swapping

       此外,造成JVM "Stop-The-World"的原因也是多方面的,没有包治百病的神药,需要去分析和测试实际生产环境下Elasticsearch集群的负载和配置。Elasticsearch已经提供了很多内部参数帮助我们了解系统节点的运行情况,建议大家好好阅读Monitoring Individual Nodes 这篇文档,了解这些参数的意义。Six Ways to Crash Elasticsearch 也给出一些可以让Elasticsearch崩溃的例子。


分享原文:http://blog.csdn.net/quicknet/article/details/45148447
参考:http://jprante.github.io/2012/11/28/Elasticsearch-Java-Virtual-Machine-settings-explained.html


收起阅读 »

IT设备管理之基础设施

什么是服务器 简单的说,服务器就是在网络中为其他客户机提供服务的计算机服务器是计算机的一种,它是在网络操作系统的控制下为网络环境里的客户机提供(如PC) 共享资源(包括查询、存储、计算等)的高性能计算机,它的高性能主要体现在高速度的CPU 运算能...
继续阅读 »


什么是服务器


server.png

简单的说,服务器就是在网络中为其他客户机提供服务的计算机
服务器是计算机的一种,它是在网络操作系统的控制下为网络环境里的客户机提供(如PC) 共享资源(包括查询、存储、计算等)的高性能计算机,它的高性能主要体现在高速度的CPU 运算能力、长时间的可靠运行、强大的I/O 外部数据吞吐能力等方面。

 
服务器主要为客户机提供Web 应用、数据库、文件、打印服务。


服务器分类


按处理器架构分类 :
    [] 巨型机与大型机(专用处理器)[/][] 小型机(IA-64,RISC处理器)[/][] PC服务器(CISC处理器)[/]
 

服务器基础知识之CPU

cpu.png
处理器是服务器工作的核心部件,对于双路和多路服务器来说,升级处理器对于服务器性能的提高非常重要。32-位处理器 (CISC)
    []广阔的兼容性 [/][]64位数据总线[/][]32位地址总线[/]
64-位处理器 (IA-64,RISC)
    []支持大容量内存[/][]64位数据总线[/][]64位地址总线[/][]需要 64位操作系统 [/]

PC服务器分类

pc.png
按CPU个数来分:
    []4路及4路以上服务器(企业级服务器)[/][]2路服务器(部门级服务器)[/][]1路服务器(入门级服务器)[/]
 
pcserver.png

内存错误和防止出现内存错误的方法 

memerror.png
    []单位 (1位数据错误)[/][]多位 (超过1位数据错)[/][]硬件错 – 数据错误反复出现,即使在“擦除”错误以后  (来自:DRAM, DIMM插槽, 或控制器中的物理错误)[/][]软错误 – 在“擦除”错误以后 出现的数据错误(来自:由于高度活动的粒子产生断断续续的错误)[/]
Memtype.png
    []先进的测试方法可以提高内存的可靠性 [/][]错误检查/纠正技术 [/][]ECC 内存 [/][]多位ECC内存 [/]

存储的演变

san1.png
san2.png

磁盘

disk.png
常见的磁盘种类:
    []Serial ATA (SATA)磁盘[/][]Serial Attached SCSI (SAS)磁盘[/][]SSD 磁盘[/]
磁盘主要参数:
    []磁盘尺寸:3.5”/2.5”/1.8”[/][]磁盘容量:146GB/300GB/500GB…[/][]磁盘转速:10K/15K/7200[/][]是否支持热插拔[/][]平均无故障时间(MTBF)[/][]内外部传输速率[/][]平均寻道时间 [/][]IOPS[/]

传输率对比

sl1.png
sl2.png

机架式服务器

 
jijia.png

Raid基本概念

RAID (Redundant Array of Independent Disks)即独立磁盘冗余阵列,RAID技术将多个单独的物理硬盘以不同的方式组合成一个逻辑硬盘,从而达到提升存储容量、读写性能和数据安全性的目的。根据不同的组合方式可以分为不同的RAID级别
raid_level.png

Raid出现原因

useraid.png

RAID 0 条带存储(Striping) 

Raid0.png

RAID 1 镜像/双工 

Raid1.png

RAID 5 (条带技术+分布式校验)

 
Raid5.png

Raid级别比较

Raidjibie.png
其中RAID3与RAID5的区别为:RAID3更适合于顺序存取,RAID5更适合于随机存取。需要根据具体的应用情况决定使用那种RAID级别。

RAID性能比较

raid_perf.png

存储体系架构介绍 

    [] Direct Attached Storage(DAS)直接外挂存储 [/]
                      服务器直接后挂存储设备,最经济的一种结构。 
    [] Network Attached Storage (NAS)网络连接存储 [/]
                     网络上直接挂接的存储设备,相当于一个网络文件共享服务器。 
    [] Storage Area Network (SAN)存储区域网络应用光纤技术的SAN网络,传输介质为光纤,性能最高,目前使用较广  [/][]ISCSI(IP-SAN)[/]
                     iSCSI-利用TCP/IP协议连接存储设备,可以理解为SCSI over IP,是将SCSI命令封装到TCP/IP数据包中,通过IP网络传输SCSI数据。DAS
    []优点:  成本低,对于小型用户来说,易于维护[/][]缺点:  性能不高,系统停机多,资源无法共享,多系统环境下的管理成本增加[/]
NAS
    []优点:  方便,文件级的数据共享,集中化管理[/][]缺点:  需要贡献文件系统,安全性无法保障,性能一般,磁盘级数据无法共享/集中,复杂系统的成本大,维护难,扩容受限[/]
SAN
    []优点:  集中化的管理,高性能,减少停机时间,安全保障高[/][]缺点:  成本昂贵、系统复杂。磁盘阵列的兼容性限制了设备选择空间及资源共享。[/]

DAS、NAS、SAN与ISCSI性能比较

sas.png

数据封装的图示

shujufx.png

数据封装的例子 

fzlz.png

基本网络设备

根据网络设备作用在OSI的层次,有以下几种类型:
    []第1层(物理层)                中继器  HUB[/][]第2层(数据链路层)        网桥  交换机[/][]第3层(网络层)                路由器[/]
 

交换机Switch/网卡

switch.png
交换机是OSI模型的第二层设备,在OSI参考模型的数据链路层(第二层)工作,交换机根据进入端口数据帧的MAC地址来过滤、转发或扩散该数据帧。
network.png
提供计算机与计算机网络的数据传输,也称为网络适配器(LAN Adapter),集成在主板上,或插在主板的扩展槽中,可以是以太网卡、令牌环网卡或FDDI网卡

路由器Router

router.png
路由器在网络间传送基于网络层或者说第三层信息的的数据分组
路由器能够对智能判定数据在网络上传送的最佳路径

交换机和路由器的区别

[list=1][]工作层次不同;[/][]数据转发所依据的对象不同;[/][]是否可以分割广播域;[/][]路由器提供了防火墙的服务.[/]


传输介质


传输介质是网络中信息传递的载体。传输介质的性能直接影响网络的运行。网络常用的传输介质有同轴电缆、双绞线、光缆等。在这三种传输介质中,双绞线被广泛应用于电话系统中,它的性能较差,但价格也比较低;同轴电缆在有线电视系统中经常采用,它的性能较好,价格适中;光纤则是最先进的通信线路,它的各项性能指标都非常好,但成本很高而且连接起来有一定的难度。 

收起阅读 »

Elasticsearch内存详解

“该给ES分配多少内存?”  “JVM参数如何优化?“ “为何我的Heap占用这么高?” “为何经常有某个field的数据量超出内存限制的异常?“ “为何感觉上没多少数据,也会经常Out Of Memory?” 以上问题,显然没有一个统一的数学公式能够给出答...
继续阅读 »
“该给ES分配多少内存?” 
“JVM参数如何优化?“
“为何我的Heap占用这么高?”
“为何经常有某个field的数据量超出内存限制的异常?“
“为何感觉上没多少数据,也会经常Out Of Memory?”

以上问题,显然没有一个统一的数学公式能够给出答案。 和数据库类似,ES对于内存的消耗,和很多因素相关,诸如数据总量、mapping设置、查询方式、查询频度等等。默认的设置虽开箱即用,但不能适用每一种使用场景。作为ES的开发、运维人员,如果不了解ES对内存使用的一些基本原理,就很难针对特有的应用场景,有效的测试、规划和管理集群,从而踩到各种坑,被各种问题挫败。

要理解ES如何使用内存,先要尊重下面两个基本事实:
  1.  ES是JAVA应用
  2.  底层存储引擎是基于Lucene的

看似很普通是吗?但其实没多少人真正理解这意味着什么。 

首先,作为一个JAVA应用,就脱离不开JVM和GC。很多人上手ES的时候,对GC一点概念都没有就去网上抄各种JVM“优化”参数,却仍然被heap不够用,内存溢出这样的问题搞得焦头烂额。了解JVM GC的概念和基本工作机制是很有必要的,本文不在此做过多探讨,读者可以自行Google相关资料进行学习。如何知道ES heap是否真的有压力了? 推荐阅读这篇博客:Understanding Memory Pressure Indicator。 即使对于JVM GC机制不够熟悉,头脑里还是需要有这么一个基本概念: 应用层面生成大量长生命周期的对象,是给heap造成压力的主要原因,例如读取一大片数据在内存中进行排序,或者在heap内部建cache缓存大量数据。如果GC释放的空间有限,而应用层面持续大量申请新对象,GC频度就开始上升,同时会消耗掉很多CPU时间。严重时可能恶性循环,导致整个集群停工。因此在使用ES的过程中,要知道哪些设置和操作容易造成以上问题,有针对性的予以规避。

其次,Lucene的倒排索引(Inverted Index)是先在内存里生成,然后定期以段文件(segment file)的形式刷到磁盘的。每个段实际就是一个完整的倒排索引,并且一旦写到磁盘上就不会做修改。 API层面的文档更新和删除实际上是增量写入的一种特殊文档,会保存在新的段里。不变的段文件易于被操作系统cache,热数据几乎等效于内存访问。 
 
基于以上2个基本事实,我们不难理解,为何官方建议的heap size不要超过系统可用内存的一半。heap以外的内存并不会被浪费,操作系统会很开心的利用他们来cache被用读取过的段文件。

Heap分配多少合适?遵从官方建议就没错。 不要超过系统可用内存的一半,并且不要超过32GB。JVM参数呢?
对于初级用户来说,并不需要做特别调整,仍然遵从官方的建议,将xms和xmx设置成和heap一样大小,避免动态分配heap size就好了。虽然有针对性的调整JVM参数可以带来些许GC效率的提升,当有一些“坏”用例的时候,这些调整并不会有什么魔法效果帮你减轻heap压力,甚至可能让问题更糟糕。

那么,ES的heap是如何被瓜分掉的? 说几个我知道的内存消耗大户并分别做解读:
    [] segment memory[/][]  filter cache[/][]  field data cache[/][]  bulk queue[/][]  indexing buffer[/][]  state buffer[/][]  超大搜索聚合结果集的fetch[/]


Segment Memory


Segment不是file吗?segment memory又是什么?前面提到过,一个segment是一个完备的lucene倒排索引,而倒排索引是通过词典 (Term Dictionary)到文档列表(Postings List)的映射关系,快速做查询的。 由于词典的size会很大,全部装载到heap里不现实,因此Lucene为词典做了一层前缀索引(Term Index),这个索引在Lucene4.0以后采用的数据结构是FST (Finite State Transducer)。 这种数据结构占用空间很小,Lucene打开索引的时候将其全量装载到内存中,加快磁盘上词典查询速度的同时减少随机磁盘访问次数。
 
下面是词典索引和词典主存储之间的一个对应关系图:
esmem.png

Lucene  file的完整数据结构参见Apache Lucene - Index File Formats
 
说了这么多,要传达的一个意思就是,ES的data node存储数据并非只是耗费磁盘空间的,为了加速数据的访问,每个segment都有会一些索引数据驻留在heap里。因此segment越多,瓜分掉的heap也越多,并且这部分heap是无法被GC掉的! 理解这点对于监控和管理集群容量很重要,当一个node的segment memory占用过多的时候,就需要考虑删除、归档数据,或者扩容了。

怎么知道segment memory占用情况呢?  CAT API可以给出答案。
  1.  查看一个索引所有segment的memory占用情况:
esin1.png

 
  1.  查看一个node上所有segment占用的memory总和:
esin2.png

那么有哪些途径减少data node上的segment memory占用呢? 总结起来有三种方法:
  1.  删除不用的索引
  2.  关闭索引 (文件仍然存在于磁盘,只是释放掉内存)。需要的时候可以重新打开。
  3.  定期对不再更新的索引做optimize (ES2.0以后更改为force merge api)。这Optimze的实质是对segment file强制做合并,可以节省大量的segment memory。


Filter Cache


Filter cache是用来缓存使用过的filter的结果集的,需要注意的是这个缓存也是常驻heap,无法GC的。我的经验是默认的10% heap设置工作得够好了,如果实际使用中heap没什么压力的情况下,才考虑加大这个设置。


Field Data cache


在有大量排序、数据聚合的应用场景,可以说field data cache是性能和稳定性的杀手。 对搜索结果做排序或者聚合操作,需要将倒排索引里的数据进行解析,然后进行一次倒排。 这个过程非常耗费时间,因此ES 2.0以前的版本主要依赖这个cache缓存已经计算过的数据,提升性能。但是由于heap空间有限,当遇到用户对海量数据做计算的时候,就很容易导致heap吃紧,集群频繁GC,根本无法完成计算过程。 ES2.0以后,正式默认启用Doc Values特性(1.x需要手动更改mapping开启),将field data在indexing time构建在磁盘上,经过一系列优化,可以达到比之前采用field data cache机制更好的性能。因此需要限制对field data cache的使用,最好是完全不用,可以极大释放heap压力。 需要注意的是,很多同学已经升级到ES2.0,或者1.0里已经设置mapping启用了doc values,在kibana里仍然会遇到问题。 这里一个陷阱就在于kibana的table panel可以对所有字段排序。 设想如果有一个字段是analyzed过的,而用户去点击对应字段的排序表头是什么后果? 一来排序的结果并不是用户想要的,排序的对象实际是词典; 二来analyzed过的字段无法利用doc values,需要装载到field data cache,数据量很大的情况下可能集群就在忙着GC或者根本出不来结果。


Bulk Queue


一般来说,Bulk queue不会消耗很多的heap,但是见过一些用户为了提高bulk的速度,客户端设置了很大的并发量,并且将bulk Queue设置到不可思议的大,比如好几千。 Bulk Queue是做什么用的?当所有的bulk thread都在忙,无法响应新的bulk request的时候,将request在内存里排列起来,然后慢慢清掉。 这在应对短暂的请求爆发的时候有用,但是如果集群本身索引速度一直跟不上,设置的好几千的queue都满了会是什么状况呢? 取决于一个bulk的数据量大小,乘上queue的大小,heap很有可能就不够用,内存溢出了。一般来说官方默认的thread pool设置已经能很好的工作了,建议不要随意去“调优”相关的设置,很多时候都是适得其反的效果。


Indexing Buffer


Indexing Buffer是用来缓存新数据,当其满了或者refresh/flush interval到了,就会以segment file的形式写入到磁盘。 这个参数的默认值是10% heap size。根据经验,这个默认值也能够很好的工作,应对很大的索引吞吐量。 但有些用户认为这个buffer越大吞吐量越高,因此见过有用户将其设置为40%的。到了极端的情况,写入速度很高的时候,40%都被占用,导致OOM。


Cluster State Buffer


ES被设计成每个node都可以响应用户的api请求,因此每个node的内存里都包含有一份集群状态的拷贝。这个cluster state包含诸如集群有多少个node,多少个index,每个index的mapping是什么?有少shard,每个shard的分配情况等等 (ES有各类stats api获取这类数据)。 在一个规模很大的集群,这个状态信息可能会非常大的,耗用的内存空间就不可忽视了。并且在ES2.0之前的版本,state的更新是由master node做完以后全量散播到其他结点的。 频繁的状态更新都有可能给heap带来压力。 在超大规模集群的情况下,可以考虑分集群并通过tribe node连接做到对用户api的透明,这样可以保证每个集群里的state信息不会膨胀得过大。


超大搜索聚合结果集的fetch


ES是分布式搜索引擎,搜索和聚合计算除了在各个data node并行计算以外,还需要将结果返回给汇总节点进行汇总和排序后再返回。无论是搜索,还是聚合,如果返回结果的size设置过大,都会给heap造成很大的压力,特别是数据汇聚节点。超大的size多数情况下都是用户用例不对,比如本来是想计算cardinality,却用了terms aggregation + size:0这样的方式; 对大结果集做深度分页;一次性拉取全量数据等等。


小结


  1.  倒排词典的索引需要常驻内存,无法GC,需要监控data node上segment memory增长趋势。
  2.  各类缓存,field cache, filter cache, indexing cache, bulk queue等等,要设置合理的大小,并且要应该根据最坏的情况来看heap是否够用,也就是各类缓存全部占满的时候,还有heap空间可以分配给其他任务吗?避免采用clear cache等“自欺欺人”的方式来释放内存。
  3.  避免返回大量结果集的搜索与聚合。缺失需要大量拉取数据可以采用scan & scroll api来实现。
  4.  cluster stats驻留内存并无法水平扩展,超大规模集群可以考虑分拆成多个集群通过tribe node连接。
  5.  想知道heap够不够,必须结合实际应用场景,并对集群的heap使用情况做持续的监控。


分享阅读原文:http://elasticsearch.cn/article/32


收起阅读 »