100、云化中的问题

1.资源隔离相关

大部分的隔离问题都是,容器内默认读取了宿主机的资源所导致的

1.1、容器内指定的核数,不指定将使用主机的cpu核数,会导致影响其他的容器资源,导致gc的时间变长

XX:ParallelGCThreads=8,

1.2、CPU和内存的限制,大量应用跑在容器平台上或者实时发布,如果没有完善的隔离机制,将会对运行态容器生产影响,特别影响客户的感知。

对于JVM的堆计算和GC默认是按照宿主机的资源计算的,需主动指定JVM的对内存大小。

1.在JDK1.7之前可以通过显式指定堆大小实现:-Xmx512m,
可以在打包镜像是动态计算方式JVM的可用堆大小:

#!/bin/bash
limit_in_bytes=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)
if [ "$limit_in_bytes" -ne "9223372036854771712" ]
then
    limit_in_megabytes=$(expr $limit_in_bytes \/ 1048576)
    heap_size=$(expr $limit_in_megabytes - $RESERVED_MEGABYTES)
    export JAVA_OPTS="-Xmx${heap_size}m $JAVA_OPTS "
    #ParallelGCThreads = (ncpus < 8 )? 3 : (ncpus *5)/8 +3
    export JAVA_OPTS="-XX:ParallelGCThreads数量计算m   $JAVA_OPTS "
    echo JAVA_OPTS=$JAVA_OPTS
fi
exec catalina.sh run

2.在JDK1.7之后可以通过设置是否对cgroups敏感来处理,通过环境变量处理:-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:ParallelGCThreads

以下是前后的测试结果

设置前
设置后

3.JVM GC
影响:

  • JVM根据CPU创建ParallelGC数量
  • ParallelGCThreads = (ncpus < 8 )? 3 : (ncpus *5)/8 +3
  • GC线程数和想限制的数量不一致,影响其他容器
  • JVM中GC的Threads数量是调用sysconf获取的,此为宿主机的 数量
    解决办法:
    显示指定JVM参数,参考第二点
    基础镜像使用hack过的glibc
    修改kernel ,是容器拿到的数据准确

1.3、Nginx (容器内看到的Nginx worker进程数没有隔离的问题)

在物理机上配置Nginx时通常会将Nginx的worker进程数配置为CPU核心数并且会将每个worker绑定到特定CPU上,这可以有效提升进程的Cache命中率,从而减少内存访问损耗。然后Nginx配置中一般指定worker_processes指令的参数为auto,来自动检测系统的CPU核心数从而启动相应个数的worker进程。在Linux系统上Nginx获取CPU核心数是通过系统调用 sysconf(_SC_NPROCESSORS_ONLN) 来获取的,对于容器来说目前还只是一个轻量级的隔离环境,它并不是一个真正的操作系统,所以容器内也是通过系统调用sysconf(_SC_NPROCESSORS_ONLN)来获取的,这就导致在容器内,使用Nginx如果worker_processes配置为auto,看到的也是宿主机的CPU核心数。

解决的方式是:劫持系统调用sysconf,在类Unix系统上可以通过LD_PRELOAD这种机制预先加载个人编写的的动态链接库,在动态链接库中劫持系统调用sysconf并根据cgroup信息动态计算出可用的CPU核心数。

1.4、容器中的乱码

遇到docker的中文乱码问题有两处

  • vi打开文件发现中文乱码,修改
cat << EOF > /root/.vimrc
:set encoding=utf-8
:set fileencodings=ucs-bom,utf-8,cp936
:set fileencoding=gb2312
:set termencoding=utf-8
EOF
  • 导入数据库发现中文乱码修改修改数据库文件,指定编码格式为中文编码
echo "set names utf8;" >> abc.sql

3.修改系统为中文编码

echo "export.UTF-8" >> /etc/profilesource /etc/profile

4.必要时重新打镜像、

5.安装 en_US.UTF-8 并配置环境

RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

locale-gen一般用于ubuntu,localedef一般用于centos。

yum remove glibc-common -y
yum install glibc-common -y
localedef -v -c -i en_US -f UTF-8 en_US.UTF-8
localelocale -a

也就是说,docker的镜像都是阉割版,很多功能都被删除阉割了。

localedef是绑定在 glibc-common 中的,阉割版的镜像中是没有这个命令的,我们需要重新安装glibc-common,首先卸载glibc-common,然后重新安装glibc-common,最后下载自己需要的语言包。

localedef -v -c -i en_US.UTF-8为了使得镜像以后不再出现此坑,要制作镜像的时候指定环境变量

vim /root/cjm/flume/Dockerfile

ROM flume_v1.0
MAINTAINER by cgls
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
CMD ["/root/start.sh"]
docker build -t flume_v2.0 /root/cjm/flume/.

2.数据库的容器化

2.1、数据不安全

即使你要把 Docker 数据放在主机来存储 ,它依然不能保证不丢数据。 Docker volumes 的设计围绕 Union FS 镜像层提供持久存储,但它仍然缺乏保证。

使用当前的存储驱动程序,Docker 仍然存在不可靠的风险。 如果容器崩溃并数据库未正确关闭,则可能会损坏数据。

2.2、运行数据库的环境需求

数据库对IO的要求很高,需要有专门的环境,尽量不和其他的混用。
网络层面,容器的网络是在宿主机上有包了一层,就吞吐量上肯定是效率会下降。
隔离越多系统开销越大

3.容器内使用root权限privileged=true

缺点:容器能够看到所在服务器上所有容器的磁盘,导致了安全问题和性能问题
不使用的弊端:很多调用系统给的导致一些系统调用失败。可以默认给容器额外增加了sys_ptrace和sys_admin两个权限,让容器可以运行GDB和更改主机名。如果有特例容器需要更多的权限,可以在我们的平台上按服务粒度进行配置
Linux有两种IO:Direct IO和Buffered IO。Direct IO直接写磁盘,Duffered IO会先写到缓存再写磁盘,大部分场景下都是Buffered IO。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,679评论 24 1,002
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,246评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 《无言》 相聚一起进食堂,不愿话题伤心事。 惟有沉默换言语,才不至于友难当。——09.4.27 《变》 昔日颜笑乐...
    轩辕倚帅阅读 383评论 0 0
  • 夜色的温柔 打乱了言语 摇曳着辰星 熄灭了灯 梦想在一明一暗间成真 你还眷恋昨天那个只有一面之缘的人 在夜晚的静谧...
    未悸阅读 572评论 3 2