标签归档:Linux

java网络编程中ipv4和ipv6导致的机器名长短问题

使用了Java网络编程,涉及到ipv4和ipv6的问题,在hadoop集群中由于机器配置不一,会导致不同机器获取的机器名长短不一,从而引发一系列问题,如“hadoop或yarn集群任务数据本地化很差(后面会写篇文章进行分析)”。

FQDN是Fully Qualified Domain Name的缩写, 含义是完整的域名。例如, 一台机器主机名(hostname)是www, 域后缀(domain)是example.com, 那么该主机的FQDN应该是www.example.com.。其实FQDN最后是以”.”来结尾的, 但是大部分的应用和服务器都允许忽略最后这个点。

Linux下用户可以通过hostname命令查看并设置主机名. 用户也可以通过

hostname -f

命令得到该主机的FQDN。

java文档中的说法是:

java.net.preferIPv4Stack (default: false)
If IPv6 is available on the operating system, the underlying native socket will be an IPv6 socket. This allows Java(tm) applications to connect too, and accept … --> 阅读全文

Linux CGroup学习 – 入门篇

对于hadoop和hbase公用的集群来说,经常会发生实时性要求较高的任务被大任务抢占资源,严重的情况下,region server进程也会挂掉,集群的资源竞争日益严重。在下一代hadoop yarn中采用了cgroup对系统资源进行隔离,目前的hadoop-2.0.5-alpha版只考虑了对内存和CPU资源的隔离。最近学习了下cgroup,记录在此。

CGroup简介

cgroup的全称是Control Group(控制群组),是linux kernel里的一种资源管理机制,用来限制,记录和隔离资源。最早是2006年由Google的工程师开发,后来合并到kernel 2.6.24中.

cgroup的特点和应用场景有:

  1. 限制资源的使用:比如某个应用程序占用了大部分的系统资源,导致别的程序无法执行,或者在多核机器上,让某个应用程序只能使用某些CPU,保留一些给其他程序使用,或者限制程序只能使用最多2G的内存。
  2. 使用资源的优先权:让某个程序比另外一个程序使用更多的CPU。
  3. 记录CPU的使用量以收取费用:对于某些提供计算资源的公司来说,需要对CPU的使用进行收费,但是如果计算使用者到底使用了多少CPU呢?传统的方法是统计整个系统上所有指令使用的CPU时间,然后进行分析,现在通过cgroup很容易实现。
  4. 隔离不同群组的进程:对于不同群组的进程做到隔离,可用于lxc(linux container)。
  5. freezing: 暂停和恢复任务

各个模块介绍

cgroup使用预定义的控制器(子系统)来决定具体的资源限制类型,以及具体的限制参数,通过挂载伪文件系统的方式来读取设置、应用控制细节。cgroup包含了多个孤立的子系统,每一个子系统代表一个单一的资源,具有集中管理的便利性。可用的控制子系统主要包括:

  • blkio: 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
  • cpu: 为任务所使用的cpu时间提供调度控制
  • cpuacct:为任务自动生成cpu资源使用报告
  • cpuset: 为任务分配独立CPU(对于多核处理器)和内存节点
  • devices: 允许或者拒绝某些任务访问指定的设备
  • freezer: 允许挂起或者恢复群组中的任务
  • memory:限制任务所使用的内存,并自动生成内存资源报告
  • net_cls: 用类标识符(classid)来标记网络包,以便Linux流量控制(tc)能够分辨 cgroup 中的特定任务所发出的数据包
  • ns: 允许为任务分配不同的名称空间

CGroup的使用

先检查当前系统是否支持cgroup:

libcgroup工具

RHEL 6系统提供了libcgroup来管理Cgroups,该软件包中包含了一系列Cgroup工具及其使用手册。我们可以使用它来绑定Cgroups层次结构,设置Cgroups参数。如果不安装libcgroup,就需要自己手工mount挂载和用shell语句写文件的方式来设置参数了。

libcgroup的安装:

yum install libcgroup

cgconfig服务的启动和停止:

service cgconfig start|stop
--> 阅读全文

linux下使用mmap实现进程间共享内存

linux下的mmap函数是把文件内容映射到一块内存(准确的说是虚拟内存)上,可以把对文件的操作转为对内存的操作,从而可以避免很多lseek()与read()、write()操作,非常适合于操作大文件或者频繁访问的文件。mmap一般的用途有:

1.将某个真实的文件读入内存,可以频繁读写,在必要的时候写回磁盘

2.各进程间可以共享映射区域

下面这个例子是实现父子进程间共享内存。
#include
#include
#include
#include
#include
#include
#include

typedef struct {
char name[10];
int age;
} person;

int main(){
int i;
person *p_map;
int size;
size = 10*sizeof(person);
p_map=(person*)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

if(fork() == 0){

sleep(2);

for(i=0;i<10;i++){ printf("child read: the %d person %s's age is %dn", i+1,(*(p_map+i)).name , (*(p_map+i)).age); } (*p_map).age = 100; munmap(p_map, size); return 0; } for(i=0;i<10;i++){ sprintf( (*(p_map+i)).name, "name%d", i); (*(p_map+i)).age=20+i; } sleep(5); printf("parent read: the first person's age is %dn", (*p_map).age); munmap(p_map, size); return 0; }[/code] 执行结果:

linux系统高级命令

把遇到的命令都记录下

1. iostat

用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况

http://www.orczhou.com/index.php/2010/03/iostat-detail/

注意其中显示的iowait指标,表示的是CPU忙还是闲,而不是IO,http://leweiup.com/questions/747

2. vmstat

用来监控虚拟内存,内核线程、磁盘、陷阱和 CPU 活动的统计信息

http://hi.baidu.com/zxm_xdl/blog/item/f4af0bb3c7dbf9b5db335a74.html

3. free

free命令可以显示内存使用信息,而/proc/meminfo 文件记录了更详细的内存信息

4. mpstat

mpstat是MultiProcessor Statistics的缩写,报告与CPU相关的一些统计信息,这些信息存放在/proc/stat文件中

5. pmap

report memory map of a process,获取一个指定进程的内存映射表

http://blog.51osos.com/linux/linux-pmap-command/

6. ps , pstree , pstack

ps 和 pstree 命令都可以列出正在运行的所有进程。ps 告诉你每个进程占用的内存和 CPU 处理时间,而 pstree 显示的信息没那么详细,但它以树形结构显示进程之间的依赖关系,包括子进程信息。ps命令的常用参数有aux

pstack显示每个进程的栈跟踪

7. … --> 阅读全文