カテゴリー: openVZ

OpenVZで「Cannot allocate memory」が出た件。

OpenVZで「Cannot allocate memory」が出た件。

開発環境でエラーが出てると報告を受ける。

$ ls
ls: error while loading shared libraries: /lib/libpthread.so.0: cannot apply additional memory protection after relocation: Cannot allocate memory

メモリって出ているけどfreeで見た感じはメモリを使いきっているわけでは無かった。

OpenVZなのでゲスト側で以下を叩いて確認。

# cat /proc/user_beancounters

kmemsizeでfailcntが出ていた。

どうもkmemsizeのリミットが14MBでそこでひっかかっている様子。

kmemsizeとは?
OS カーネルによって割り当てられるスワップ不可のメモリサイズ(バイト)。
これには、コンテナプロセスと関連付けられたすべてのカーネル内部データ構造が含まれます(ネットワークバッファは除く)。
これらのデータ構造はサーバ RAM の最初のギガバイトに常駐するため、”low” メモリと呼ばれます。

いくつに設定していいのかわからなかったので調査。

takeのとりあえず社長日記 やっとこさOpenVZ本番運用開始。
http://blog.y2ji.co.jp/archives/51826799.html

上記ブログでメモリ1GBにつき128MBくらいということなので、
今回は3GBのメモリを割り当てているので384MBを割りあててみることに。

元が14MBだったので大幅増量。大丈夫か・・・?

CPIでは32MBとという記事も見つけた。
まつぼ x Web kmemsize
http://matsu.teraren.com/blog/2010/04/22/kmemsize/

まぁしかし開発環境なので大幅に増やしてみる。

ホスト側で。

# vzctl set 175 --kmemsize 384M --save

ゲト側で確認。

# cat /proc/user_beancounters
       uid  resource           held    maxheld    barrier      limit    failcnt
      175:  kmemsize       15109212   15679488  402653184  402653184        313

limitが384MBに上がっている。

エラーも出なくなったのでしばらく様子見。。

【openVZ】のnumprocをあげる

openVZのnumprocをあげる。。

どうもnumprocあたりの制限に引っかかった模様なので引き上げる。

とりあえず平時のサーバの状態をメモ(コンテナ側)

[root@***** ~]# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
175: kmemsize 4759207 5394432 14372700 14790164 0
lockedpages 0 0 2048 2048 0
privvmpages 45846 47872 786432 786432 0
shmpages 769 1745 21504 21504 0
dummy 0 0 0 0 0
numproc 39 47 240 240 0
physpages 16177 17402 0 2147483647 0
vmguarpages 0 0 524288 524288 0
oomguarpages 5910 5912 26112 2147483647 0
numtcpsock 10 10 360 360 0
numflock 19 22 188 206 0
numpty 1 2 100 100 0
numsiginfo 0 27 256 256 0
tcpsndbuf 101160 101160 1720320 2703360 0
tcprcvbuf 163840 163840 1720320 2703360 0
othersockbuf 8992 46608 1126080 2097152 0
dgramrcvbuf 0 1224 262144 262144 0
numothersock 93 101 120 120 0
dcachesize 1137018 1151802 3409920 3624960 0
numfile 656 755 9312 9312 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 20 20 128 128 0

【OpenVZ】numproc

コンテナ内のプロセス数の最大値を設定するパラメータ。

上記サイトを参考に理論上の制限を確認。

[root@***** ~]# cat /proc/sys/kernel/threads-max
62341

大丈夫そうなのでとりあえず1000に設定してみる。

ホスト側で以下を実行

[root@localhost ~]# vzctl set 175 --numproc 1000:1000 --save
UB limits were set successfully
CT configuration saved to /etc/vz/conf/175.conf

コンテナ側で確認。

[root@***** ~]# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
175: kmemsize 4763303 5394432 14372700 14790164 0
lockedpages 0 0 2048 2048 0
privvmpages 45846 47872 786432 786432 0
shmpages 769 1745 21504 21504 0
dummy 0 0 0 0 0
numproc 39 47 1000 1000 0
physpages 16180 17402 0 2147483647 0
vmguarpages 0 0 524288 524288 0
oomguarpages 5913 5913 26112 2147483647 0
numtcpsock 10 10 360 360 0
numflock 19 22 188 206 0
numpty 1 2 100 100 0
numsiginfo 0 27 256 256 0
tcpsndbuf 101160 101160 1720320 2703360 0
tcprcvbuf 163840 163840 1720320 2703360 0
othersockbuf 8992 46608 1126080 2097152 0
dgramrcvbuf 0 1224 262144 262144 0
numothersock 93 101 120 120 0
dcachesize 1137018 1151802 3409920 3624960 0
numfile 656 755 9312 9312 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 20 20 128 128 0

あがってるので良いはず。

【openVZ】ホスト側コンテナの場所を変更する

openVZのホスト側コンテナの場所を変更する

■デフォルトコンテナの位置を変える
サーバの容量の都合で場所変えたくなったりする。

#vim /etc/vz/vz.conf

## Defaults for containers
VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEID

↓以下に変更した

## Defaults for containers
VE_ROOT=/home/vz/root/$VEID
VE_PRIVATE=/home/vz/private/$VEID

これで次回以降作成するコンテナは/home側に作られる。

■各コンテナの設定ファイルの場所

/etc/vz/conf

※実際はシンボリックだった

# pwd
/etc/vz

# ll
合計 20
lrwxrwxrwx. 1 root root   23  3月 15 20:01 2012 conf -> ../sysconfig/vz-scripts
drwxr-xr-x. 3 root root 4096  3月 15 20:01 2012 dists
-rw-r--r--. 1 root root  739  1月 15 04:52 2012 download.conf
drwxr-xr-x. 2 root root 4096  1月 15 04:52 2012 names
-rw-r--r--. 1 root root  345  1月 15 04:52 2012 osrelease.conf
-rw-r--r--  1 root root 1335  3月 26 13:36 2012 vz.conf

■久しぶりにコンテナ立てたのでその時の作業ログ

□コンテナ作成
[root@localhost ~]# vzctl create 175 --ostemplate centos-6-x86 --config basic
Creating container private area (centos-6-x86)
Performing postcreate actions
CT configuration saved to /etc/vz/conf/175.conf
Container private area was created

□起動設定
[root@localhost ~]# vzctl set 175 --onboot yes --save
CT configuration saved to /etc/vz/conf/175.conf

□host名設定
[root@localhost ~]# vzctl set 175 --hostname openvz.example.com --save
CT configuration saved to /etc/vz/conf/175.conf

□IPアドレス設定
[root@localhost ~]# vzctl set 175 --ipadd 192.168.1.175 --save
CT configuration saved to /etc/vz/conf/175.conf

□ソケット設定
[root@localhost ~]# vzctl set 175 --numothersock 120 --save
CT configuration saved to /etc/vz/conf/175.conf

□ネームサーバ設定
[root@localhost ~]# vzctl set 175 --nameserver 192.168.1.1 --save
CT configuration saved to /etc/vz/conf/175.conf

□コンテナ起動
[root@localhost ~]# vzctl start 175
Starting container ...
Container is mounted
Adding IP address(es): 192.168.1.175
Setting CPU units: 1000
Container start in progress...

□rootパスワード設定
[root@localhost ~]# vzctl exec 175 passwd
New password: ルートパスワード設定
Retype new password: ルートパスワード設定
Changing password for user root.
passwd: all authentication tokens updated successfully.

□言語設定
[root@localhost ~]# vzctl exec 175 'echo LANG="ja_JP.UTF-8" > /etc/sysconfig/i18n'

□時間設定
[root@localhost ~]# vzctl exec 175 'mv /etc/localtime /etc/localtime.org'
[root@localhost ~]# vzctl exec 175 'ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime'

□HDD容量設定
[root@localhost ~]# vzctl set 175 --diskspace 100G:105G --save

□メモリ設定
[root@localhost ~]# vzctl set 175 --vmguarpages $((256 * 2048)) --save
UB limits were set successfully
CT configuration saved to /etc/vz/conf/175.conf
[root@localhost ~]# vzctl set 175 --privvmpages $((256 * 3072)) --save
UB limits were set successfully
CT configuration saved to /etc/vz/conf/175.conf

□容量増やしたのにinode増やしてなくてエラーでので増量
[root@localhost ~]# vzctl set 175 --diskinodes $(( 200000*3 )):$(( 220000*3 )) --save

□コンテナの稼動状況
[root@localhost ~]# vzlist -a
      CTID      NPROC STATUS    IP_ADDR         HOSTNAME
      ・・・
       175         38 running   192.168.1.175   openvz.example.com
	・・・

OpenVZのリソース状態を確認

OpenVZのリソース状態を確認する。

コンテナ側で以下のコマンドを実行

# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
171: kmemsize 8808593 10514432 14372700 14790164 0
lockedpages 0 0 2048 2048 0
privvmpages 86999 152549 262144 262144 0
shmpages 4511 5807 21504 21504 0
dummy 0 0 0 0 0
numproc 65 86 240 240 0
physpages 58785 457240 0 2147483647 0
vmguarpages 0 0 131072 131072 0
oomguarpages 43503 52001 26112 2147483647 0
numtcpsock 28 39 360 360 0
numflock 16 188 188 206 3819
numpty 4 6 16 16 0
numsiginfo 0 15 256 256 0
tcpsndbuf 213856 1438168 1720320 2703360 0
tcprcvbuf 214040 1718240 1720320 2703360 2
othersockbuf 15736 198024 1126080 2097152 0
dgramrcvbuf 0 4296 262144 262144 0
numothersock 114 120 120 120 17517
dcachesize 2887879 3624960 3409920 3624960 0
numfile 1148 1340 9312 9312 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 20 20 128 128 0

「failcnt」が0なら健全らしい。

そもそもなんで今回この値を確認したくなったかというと、
コンテナ中にsambaをインストールしている環境でコンテナ側からwindows上にファイルを
コピーすると途中で止まると言われたから。

上記の結果からすると「numflock」と「numothersock」が良くない感じになっている。
それぞれの意味はこちら。

【numflock】
全てのVPS プロセスが作成するファイルロックの数

【numothersock】
TCP 以外のソケットの数。ローカル(UNIX ドメイン)
ソケットはシステム内の通信に使用されます。
UDP ソケットは、ドメインネーム サービス(DNS)の
クエリなどに使用されます。
UDPおよびその他ソケットで使用されます。

とりあえず「numothersock」から上限をあげてみた。

vzctl set 171 --numothersock 512 --save

で、もう一回samba経由でファイルを大量にコピーしてもらうも駄目。
でも「numothersock」のfailcntは増えなくなったのでこれはこれでいいみたい。

次に「numflock」も上限をあげてみる

vzctl set 171 --numflock 350 --save

で、もう一回samba経由でファイルを大量にコピーしてもらうも駄目。
「maxheld」の値が350までいってしまったのでまだ足りないということか、、、。
だめもとで一回無制限にしてみる

vzctl set 171 --numflock unlimited --save

この状態でsamba経由で大量にファイルをコピーしてもらったら出来た!
終った状態で「numflock」の「maxheld」を見ると2071だった。。
全然足りてなかったな。。

とりあえずこれでOKということにしておく。
今回初めてunlimitedなんていう設定値があることを知った。
OpenVZ環境で何か問題があったら「/proc/user_beancounters」をみよう。

OpenVZのCentOS6(guest)でyum-fastestmirrorのエラーが出た。

OpenVZのCentOS6(guest)でyum-fastestmirrorのエラーが出た。

実験機のOpenVZのゲストにjavaを入れようとしたらyumでエラーが出た。

# yum search java
Loaded plugins: fastestmirror
Determining fastest mirrors
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 285, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 136, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 438, in doCommands
    return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)
  File "/usr/share/yum-cli/yumcommands.py", line 686, in doCommand
    return base.search(extcmds)
  File "/usr/share/yum-cli/cli.py", line 1030, in search
    for (po, keys, matched_value) in matching:
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 2540, in searchGenerator
    for sack in self.pkgSack.sacks.values():
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 897, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 682, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 265, in populateSack
    self.doSetup()
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 92, in doSetup
    self.ayum.plugins.run('postreposetup')
  File "/usr/lib/python2.6/site-packages/yum/plugins.py", line 184, in run
    func(conduitcls(self, self.base, conf, **kwargs))
  File "/usr/lib/yum-plugins/fastestmirror.py", line 202, in postreposetup_hook
    all_urls = FastestMirror(all_urls).get_mirrorlist()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 369, in get_mirrorlist
    self._poll_mirrors()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 413, in _poll_mirrors
    pollThread.start()
  File "/usr/lib/python2.6/threading.py", line 474, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

とりあえず「yum clean all」するも駄目。

# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base extras updates vz-base vz-updates
Cleaning up Everything
Cleaning up list of fastest mirrors

fastestmirrorが悪いのかな?と思い以下を実行

# rpm -ev --nodeps fastestmirror
error: package yum-fastestmirror is not installed

そんなのは無いといわれる。

色々調べてみたところ同じような現象に遭遇していた人がいたので
そこのブログの内容を参考に対応してみる。

要するに、VPSだとyumでメモリ不足の問題が発生する事が多いから、
fastestmirror pluginは使わないでね、という事みたいですね。

ということなので同じように「–disablepplugin」してみる。

# yum --disableplugin=fastestmirror search java

できた!

こっちもおんなじ用に毎回「–disablepplugin」するの面倒なので
削除を試みる。

# rpm -qa | grep yum
yum-3.2.29-30.el6.centos.noarch
yum-metadata-parser-1.1.2-16.el6.i686
yum-plugin-fastestmirror-1.1.30-14.el6.noarch
# rpm -ev --nodeps yum-plugin-fastestmirror-1.1.30-14.el6.noarch
# yum search java

出来た

■参考URL

yumでyum-fastestmirrorのエラーAdd Star

[DTI ServersMan@VPS]yum updateで早速エラーですよ。

OpenVZのゲスト側で他のNAS(TeraStasion)のフォルダをマウントする

OpenVZのゲスト側で他のNAS(TeraStasion)のフォルダをマウントする設定を
していたけど、すっかり忘れていたのでメモ。

ホストはCentOS6.2

■大体の構成

ホストサーバにOpenVZをいれて複数のゲストサーバ
を立てて社内の開発環境を構築していて、ゲスト側
で社内の他のNASにアクセスできるように設定を行っている。
主にホストの「/etc/fstab」と「/etc/rc.d/rc.local」で
実現している。

「/etc/rc.d/rc.local」とは起動プロセスの最後に実行されるシェルスクリプトのこと。

今回はこれが思い出せなかった・・・。

■そもそもなんでそんなことになったのか。

OpenVZを使ってゲスト側で直接NAS(TeraStasion)を
マウントしようとしてもcifsのエラーが出てmount
出来なかった。

■回避方法

ホスト側で起動時にマウントを行うようにし、
マウントしてOpenVZが起動し終わったあとに
/etc/rc.d/rc.local
で各ゲストにbindするように設定してみた。

■ホスト側の/etc/fstabサンプル

#
# /etc/fstab
# Created by anaconda on Thu Mar 15 05:40:21 2012
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=2f2b3876-c89f-49b9-896b-4436a2cf4199 /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0

# mount1
192.168.1.xx:/mnt/array1/folder1 /mnt/mout_folder1 nfs rsize=8192,wsize=8192,nolock,hard,intr 0 0
# mount2
192.168.1.xx:/mnt/array1/folder2 /mnt/mout_folder2 nfs rsize=8192,wsize=8192,hard,intr 0 0

「mnt/array1」とかなっているマウントしたい対象のNASは
今回のケースではBuffaloのTeraStation。
TeraStationはNFSの機能が付いていたのでNFSフォルダーと
NFSクライアント設定を事前に作成しておいた。

■ホスト側の/etc/rc.d/rc.localサンプル

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
#bind
mount --bind /mnt/mout_folder1 /home/vz/root/180/var/www/html/clients
以下続く・・・。

上記はホストでマウントしたフォルダをホスト上にあるOpenVZのゲストのフォルダにbindしている。
これで結果的にゲスト側でもマウントしているような状態でファイルが操作できる。
mount –bindはマウントしたファイルシステムの一部を別のディレクトリにマウントし直すと
いうシンボリック的な役割をしてくれる。

 

こうやって書いてみると面倒な仕組みになってるなー。
他にやり方ないのかな?

 

CentOS6.2をホストにしてopenVZ入れてコンテナのバックアップとバックアップからのコンテナの作成メモ

タイトルの通り・・・
CentOS6.2をホストにしてopenVZ入れてコンテナのバックアップとバックアップからのコンテナの作成メモ

環境CentOS6.2

■openVZのインストール自体は以下のサイトを参考に

Installing And Using OpenVZ On CentOS 6.0

■vzdumpのインストール

◇ダウンロードしてインストールしてみる。

#wget http://download.openvz.org/contrib/utils/vzdump/vzdump-1.2-4.noarch.rpm
#rpm -i vzdump-1.2-4.noarch.rpm

◇足りないって言われる

エラー: 依存性の欠如:
		cstream は vzdump-1.2-4.noarch に必要とされています
		perl(LockFile::Simple) は vzdump-1.2-4.noarch に必要とされています

◇足りないものを入れる為にrpmforgeリポジトリの追加

#rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
#rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

◇設定ファイルでenabledを全部0にしておく

#vi /etc/yum.repos.d/rpmforge.repo
#cat /etc/yum.repos.d/rpmforge.repo |grep enabled

◇vzdumpで必要とされたものをinstall

#yum --enablerepo=rpmforge install cstream
#yum --enablerepo=rpmforge install perl-LockFile-Simple

◇再度インストール

#rpm -i vzdump-1.2-4.noarch.rpm

■コンテナのバックアップのとり方

◇サスペンドにして圧縮してバクアップをとる方式で

#vzdump -suspend -compress ID
#cd /vz/dump/
#ls -al

バックアップ取れてるか確認

[root@cent6_2dev dump]# ll
合計 265564
-rw-r--r-- 1 root root      3046  3月  8 11:08 2012 vzdump-openvz-220-2012_03_08-11_05_41.log
-rw-r--r-- 1 root root 271930677  3月  8 11:08 2012 vzdump-openvz-220-2012_03_08-11_05_41.tgz

■バックアップを利用してコンテナを作成する場合

◇元々コンテナID220でIPも220なものをコンテナID221、IP221で複製する場合

#vzrestore /vz/dump/vzdump-openvz-220-2012_03_08-11_05_41.tgz 221
#vzctl set 221 --hostname dev2.artis.com --save
#vzctl set 221 --ipadd 192.168.1.221 --save
#vim /etc/vz/conf/221.conf //IPが追加になっちゃうので前のIPを消す
#vzctl start 221 

その後はサーバに接続してIPに関連する箇所を修正する