[user@俺 ~]$ reboot

何年か新しいIT技術と向き合っていないうちに、浦島太郎になってしまった...そんなインフラ技術者の日記

MEMO : How to install Ansible on centos 7.x .

centos 7.x へAnsible をインストールするときのメモ。Ansibleはepelに公開されているyumパッケージ版ど導入。インストールには、yumコマンドを使用して実行。

環境情報

virtualbox に、ゲストOSとして、CentOSをインストール

  • VirtualBox Version:
  • CPU:1 core
  • RAM:8192MB
  • HDD:40GB

※構築したゲストは、インターネットアクセスが可能な環境で実施。

OSインストール

Centos7.x everything dvd から、core パッケージでインストールを実行。 ※インターネット上のyum repository を使いたいので、ネットワークの設定はきちんと行いましょう。

OS アップデート

インストール完了した状態で、OSアップデートを実行。 ※これは、要件ではありませんが、CentOSのメディアが、だいぶ古い(7.1)ものだったので、最新の状態(まだ、CentOSは、7.3にはなっていないという...)を、使って確認しました。

# yum update -y

※作業時点(2016/11/23)では、アップデート完了後、"CentOS Linux release 7.2.1511 (Core)"となった。

epelリポジトリ追加

epelリポジトリを追加する。CentOSの標準リポジトリには、Ansibleパッケージは用意されていないため、yum でepelリポジトリを利用できるようにする。

# yum install epel-release.noarch -y

Ansible インストール

yumコマンドにて、Ansible パッケージをインストールする。

# yum install ansible

インストールログ

[root@ansible ~]# yum install ansible
Loaded plugins: fastestmirror
epel/x86_64/metalink                                                                             | 4.8 kB  00:00:00
epel                                                                                             | 4.3 kB  00:00:00
(1/3): epel/x86_64/group_gz                                                                      | 170 kB  00:00:00
(2/3): epel/x86_64/updateinfo                                                                    | 678 kB  00:00:00
(3/3): epel/x86_64/primary_db                                                                    | 4.3 MB  00:00:00
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.riken.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Resolving Dependencies
--> Running transaction check
---> Package ansible.noarch 0:2.2.0.0-3.el7 will be installed
--> Processing Dependency: sshpass for package: ansible-2.2.0.0-3.el7.noarch
--> Processing Dependency: python-six for package: ansible-2.2.0.0-3.el7.noarch
--> Processing Dependency: python-paramiko for package: ansible-2.2.0.0-3.el7.noarch
--> Processing Dependency: python-keyczar for package: ansible-2.2.0.0-3.el7.noarch
--> Processing Dependency: python-jinja2 for package: ansible-2.2.0.0-3.el7.noarch
--> Processing Dependency: python-httplib2 for package: ansible-2.2.0.0-3.el7.noarch
--> Processing Dependency: PyYAML for package: ansible-2.2.0.0-3.el7.noarch
--> Running transaction check
---> Package PyYAML.x86_64 0:3.10-11.el7 will be installed
--> Processing Dependency: libyaml-0.so.2()(64bit) for package: PyYAML-3.10-11.el7.x86_64
---> Package python-httplib2.noarch 0:0.7.7-3.el7 will be installed
---> Package python-jinja2.noarch 0:2.7.2-2.el7 will be installed
--> Processing Dependency: python-babel >= 0.8 for package: python-jinja2-2.7.2-2.el7.noarch
--> Processing Dependency: python-markupsafe for package: python-jinja2-2.7.2-2.el7.noarch
---> Package python-keyczar.noarch 0:0.71c-2.el7 will be installed
--> Processing Dependency: python-pyasn1 for package: python-keyczar-0.71c-2.el7.noarch
--> Processing Dependency: python-crypto for package: python-keyczar-0.71c-2.el7.noarch
---> Package python-six.noarch 0:1.9.0-2.el7 will be installed
---> Package python2-paramiko.noarch 0:1.16.1-1.el7 will be installed
--> Processing Dependency: python2-ecdsa for package: python2-paramiko-1.16.1-1.el7.noarch
---> Package sshpass.x86_64 0:1.05-5.el7 will be installed
--> Running transaction check
---> Package libyaml.x86_64 0:0.1.4-11.el7_0 will be installed
---> Package python-babel.noarch 0:0.9.6-8.el7 will be installed
---> Package python-markupsafe.x86_64 0:0.11-10.el7 will be installed
---> Package python-pyasn1.noarch 0:0.1.6-2.el7 will be installed
---> Package python2-crypto.x86_64 0:2.6.1-9.el7 will be installed
--> Processing Dependency: libtomcrypt.so.0()(64bit) for package: python2-crypto-2.6.1-9.el7.x86_64
---> Package python2-ecdsa.noarch 0:0.13-4.el7 will be installed
--> Running transaction check
---> Package libtomcrypt.x86_64 0:1.17-23.el7 will be installed
--> Processing Dependency: libtommath >= 0.42.0 for package: libtomcrypt-1.17-23.el7.x86_64
--> Processing Dependency: libtommath.so.0()(64bit) for package: libtomcrypt-1.17-23.el7.x86_64
--> Running transaction check
---> Package libtommath.x86_64 0:0.42.0-4.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                            Arch                    Version                         Repository             Size
========================================================================================================================
Installing:
 ansible                            noarch                  2.2.0.0-3.el7                   epel                  4.6 M
Installing for dependencies:
 PyYAML                             x86_64                  3.10-11.el7                     base                  153 k
 libtomcrypt                        x86_64                  1.17-23.el7                     epel                  224 k
 libtommath                         x86_64                  0.42.0-4.el7                    epel                   35 k
 libyaml                            x86_64                  0.1.4-11.el7_0                  base                   55 k
 python-babel                       noarch                  0.9.6-8.el7                     base                  1.4 M
 python-httplib2                    noarch                  0.7.7-3.el7                     epel                   70 k
 python-jinja2                      noarch                  2.7.2-2.el7                     base                  515 k
 python-keyczar                     noarch                  0.71c-2.el7                     epel                  218 k
 python-markupsafe                  x86_64                  0.11-10.el7                     base                   25 k
 python-pyasn1                      noarch                  0.1.6-2.el7                     base                   91 k
 python-six                         noarch                  1.9.0-2.el7                     base                   29 k
 python2-crypto                     x86_64                  2.6.1-9.el7                     epel                  475 k
 python2-ecdsa                      noarch                  0.13-4.el7                      epel                   83 k
 python2-paramiko                   noarch                  1.16.1-1.el7                    epel                  257 k
 sshpass                            x86_64                  1.05-5.el7                      epel                   21 k

Transaction Summary
========================================================================================================================
Install  1 Package (+15 Dependent packages)

Total download size: 8.1 M
Installed size: 36 M
Is this ok [y/d/N]: y
Downloading packages:
(1/16): PyYAML-3.10-11.el7.x86_64.rpm                                                            | 153 kB  00:00:00
warning: /var/cache/yum/x86_64/7/epel/packages/ansible-2.2.0.0-3.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Public key for ansible-2.2.0.0-3.el7.noarch.rpm is not installed
(2/16): ansible-2.2.0.0-3.el7.noarch.rpm                                                         | 4.6 MB  00:00:03
(3/16): libtomcrypt-1.17-23.el7.x86_64.rpm                                                       | 224 kB  00:00:00
(4/16): libtommath-0.42.0-4.el7.x86_64.rpm                                                       |  35 kB  00:00:00
(5/16): python-httplib2-0.7.7-3.el7.noarch.rpm                                                   |  70 kB  00:00:00
(6/16): python-keyczar-0.71c-2.el7.noarch.rpm                                                    | 218 kB  00:00:00
(7/16): libyaml-0.1.4-11.el7_0.x86_64.rpm                                                        |  55 kB  00:00:00
(8/16): python-markupsafe-0.11-10.el7.x86_64.rpm                                                 |  25 kB  00:00:00
(9/16): python-pyasn1-0.1.6-2.el7.noarch.rpm                                                     |  91 kB  00:00:00
(10/16): python-jinja2-2.7.2-2.el7.noarch.rpm                                                    | 515 kB  00:00:00
(11/16): python-babel-0.9.6-8.el7.noarch.rpm                                                     | 1.4 MB  00:00:00
(12/16): python-six-1.9.0-2.el7.noarch.rpm                                                       |  29 kB  00:00:00
(13/16): python2-crypto-2.6.1-9.el7.x86_64.rpm                                                   | 475 kB  00:00:02
(14/16): python2-ecdsa-0.13-4.el7.noarch.rpm                                                     |  83 kB  00:00:00
(15/16): python2-paramiko-1.16.1-1.el7.noarch.rpm                                                | 257 kB  00:00:00
(16/16): sshpass-1.05-5.el7.x86_64.rpm                                                           |  21 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------
Total                                                                                   1.1 MB/s | 8.1 MB  00:00:07
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-6.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Is this ok [y/N]: y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : python-six-1.9.0-2.el7.noarch                                                                       1/16
  Installing : python2-ecdsa-0.13-4.el7.noarch                                                                     2/16
  Installing : sshpass-1.05-5.el7.x86_64                                                                           3/16
  Installing : libtommath-0.42.0-4.el7.x86_64                                                                      4/16
  Installing : libtomcrypt-1.17-23.el7.x86_64                                                                      5/16
  Installing : python2-crypto-2.6.1-9.el7.x86_64                                                                   6/16
  Installing : python2-paramiko-1.16.1-1.el7.noarch                                                                7/16
  Installing : python-babel-0.9.6-8.el7.noarch                                                                     8/16
  Installing : python-pyasn1-0.1.6-2.el7.noarch                                                                    9/16
  Installing : python-keyczar-0.71c-2.el7.noarch                                                                  10/16
  Installing : python-httplib2-0.7.7-3.el7.noarch                                                                 11/16
  Installing : python-markupsafe-0.11-10.el7.x86_64                                                               12/16
  Installing : python-jinja2-2.7.2-2.el7.noarch                                                                   13/16
  Installing : libyaml-0.1.4-11.el7_0.x86_64                                                                      14/16
  Installing : PyYAML-3.10-11.el7.x86_64                                                                          15/16
  Installing : ansible-2.2.0.0-3.el7.noarch                                                                       16/16
  Verifying  : python-keyczar-0.71c-2.el7.noarch                                                                   1/16
  Verifying  : libyaml-0.1.4-11.el7_0.x86_64                                                                       2/16
  Verifying  : python-jinja2-2.7.2-2.el7.noarch                                                                    3/16
  Verifying  : python-markupsafe-0.11-10.el7.x86_64                                                                4/16
  Verifying  : python-httplib2-0.7.7-3.el7.noarch                                                                  5/16
  Verifying  : python2-ecdsa-0.13-4.el7.noarch                                                                     6/16
  Verifying  : libtomcrypt-1.17-23.el7.x86_64                                                                      7/16
  Verifying  : ansible-2.2.0.0-3.el7.noarch                                                                        8/16
  Verifying  : python2-crypto-2.6.1-9.el7.x86_64                                                                   9/16
  Verifying  : python-pyasn1-0.1.6-2.el7.noarch                                                                   10/16
  Verifying  : PyYAML-3.10-11.el7.x86_64                                                                          11/16
  Verifying  : python-babel-0.9.6-8.el7.noarch                                                                    12/16
  Verifying  : python-six-1.9.0-2.el7.noarch                                                                      13/16
  Verifying  : libtommath-0.42.0-4.el7.x86_64                                                                     14/16
  Verifying  : python2-paramiko-1.16.1-1.el7.noarch                                                               15/16
  Verifying  : sshpass-1.05-5.el7.x86_64                                                                          16/16

Installed:
  ansible.noarch 0:2.2.0.0-3.el7

Dependency Installed:
  PyYAML.x86_64 0:3.10-11.el7          libtomcrypt.x86_64 0:1.17-23.el7         libtommath.x86_64 0:0.42.0-4.el7
  libyaml.x86_64 0:0.1.4-11.el7_0      python-babel.noarch 0:0.9.6-8.el7        python-httplib2.noarch 0:0.7.7-3.el7
  python-jinja2.noarch 0:2.7.2-2.el7   python-keyczar.noarch 0:0.71c-2.el7      python-markupsafe.x86_64 0:0.11-10.el7
  python-pyasn1.noarch 0:0.1.6-2.el7   python-six.noarch 0:1.9.0-2.el7          python2-crypto.x86_64 0:2.6.1-9.el7
  python2-ecdsa.noarch 0:0.13-4.el7    python2-paramiko.noarch 0:1.16.1-1.el7   sshpass.x86_64 0:1.05-5.el7

Complete!
[root@ansible ~]# 

Ansible 導入の確認

導入が完了した時点で、Ansible のバージョンを確認。

[root@ansible ~]# ansible --version
ansible 2.2.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
[root@ansible ~]#

OpenStack Director(RDO Manager) VM Guestで構築するとOSシャットダウンがうまくいかない

OpenStack Director(RDO Manager) を、KVMゲストとして構築してまして、そのゲストVMをOSシャットダウンしようとすると、openstackの停止処理でタイミングがずれて(?)dracut が、無限ループします。

OpenStack Director , Packstack all-in-one 以外の用途で使っていても、発生する事があるようで、下記リンクにワークアラウンドが示されています。

Bug 1178497 – unable to shutdown - dracut loop rm: cannot remove /lib/drauct/hooks/shutdown/30-dm-shutdown.sh: Read-only filesystem


私の場合、Director なので、下記の対応で回避できるのだと思われます。

---------------------------------------------
If you're hitting this on a Red Hat OpenStack Platform director system (the "undercloud"), the following procedure should enable you to shut down cleanly: $ sudo openstack-service stop $ sudo ip netns delete $(ip netns) $ sudo poweroff
-------------------------------------------

とはいえ、、、systemd むずかしっす。

mongodb を Centos7へインストールする メモ

少しも新しくない情報です...mongodb コミュニティーエディションのインストールをやってみました。基本的には、mongdb org で公開されているドキュメントに従って導入すればいいのですが、細かい点で補足が必要です。

docs.mongodb.org

導入環境

  • OS:CentOS7.2 ( 作業した日の最新がそうだったというだけ)
  • CPU: VirtualBox で 1CPU を割り当て
  • RAM: 4096MB
  • HDD: 16GB
  • mongoDB: Ver.3.2 Shell Edition ( これも作業した日の最新がそうだったというだけ)
特に設計をしたわけでなく、取り敢えず動かしてみようというノリなので、これでいい
のか悪いのか、わかりません。また、公式のシステム要件としても、最低1物理コア、
メモリは多くすれば、ページフォルトを解消できる。HDDは(想定だけど)扱うデータ
の物理設計によるでしょ。ということで、明確にああしろ、こうしろという記載はない
ようです。マニュアルを全部読んだら書いてあるのかもしれませんが...

また、今回はとりあえず、シングル構成(非冗長構成)でやっています。

導入&セットアップの流れ

  • centos 7 コアでインストール
  • yum update
  • mongodb インストール
  • centos のパラメータ調整
  • mongodb の起動とアクセス

CentOS7 コアでインストール

CentOS7は、everything iso を使用して、ほぼデフォルトのインストールとしました。あまり重要じゃないので、さらっと書きます。また、後々必要なパッケージがあった場合はyum でインストールする作戦です。

導入パラメータの変更カ所

  • NIC を起動時に自動的に有効にする
  • ntp サーバを参照する(参照先はデフォルト)
  • タイムゾーンをasia/tokyo
  • ディスク構成で、swap をメモリ量と同値に変更

それ以外は、デフォルトです。下記が、インストール後のanaconda-ks.cfg

#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=enp0s3 --ipv6=auto --activate
network  --hostname=mongodb01
# Root password
rootpw --iscrypted 
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=0.centos.pool.ntp.org,1.centos.pool.ntp.org,2.centos.pool.ntp.org,3.centos.pool.ntp.org
user --groups=wheel --name=user01 --password=  --iscrypted --gecos="user01"
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel 
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=sda --sizmongodb の起動とアクセスe=500
part pv.124 --fstype="lvmpv" --ondisk=sda --size=15871
volgroup centos_mongodb01 --pesize=4096 pv.124
logvol swap  --fstype="swap" --size=4092 --name=swap --vgname=centos_mongodb01
logvol /  --fstype="xfs" --size=11776 --name=root --vgname=centos_mongodb01

%packages
@core
chrony
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

yum update

これは、いつもやる事ですが、とりあえずOSをインストmongodb の起動とアクセスールしたら、パッケージを最新化します。

# yum -y update

mongdb インストール

公開されているドキュメントに従い、インストールを行います。

公開鍵のインポート

ドキュメントどおりmongodb の起動とアクセス

# rpm --import https://www.mongodb.org/static/pgp/server-3.2.asc

yum リポジトリ定義ファイルの作成

ドキュメントどおり"/etc/yum.repos.d/mongodb-org-3.2.repo"を作成。特に、バージョンを明示しないので、そのままとしました。

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1

mongoDB のインストール

ドキュメントどおり。

# yum install -y mongodb-org

SELinux の設定

SELinux をdisable や、permissive にするのは、CentOS7.0 以降、避ける事にしているので、SELinux が有効な状態ですすめる。このために、mongodbが通信ポートでリッスンできるように設定する必要があります。 コアパッケージでインストールした状態だと、semanage関連パッケージがインストールされていないので、まずは、"policycoreutils-python"をインストールします。

# yum install policycoreutils-python

semanageコマンドが利用できるようになったら、下記コマンドで、mongoDBが27017 port を利用できるようにします。これ、任意のポートに変える場合は、そのポートを指定してコマンドを実行します。

semanage port -a -t mongod_port_t -p tcp 27017

あと、リモートから通信できるようにするためには、firewalld も設定しなくてはならないですが、デフォルトだと、127.0.0.1:27017 でリッスンするようなので、一旦、放置します。

自動起動の設定

マニュアルを読み進めていくと、mongodb の起動、停止、リスタートと続きます。service コマンドを使用した例が掲載されていますが、centos7 なので、systemctl で各操作も可能です。

  • 起動
# systemctl start mongd
  • 停止
# systemctl stop mongd
  • リスタート
# systemctl restart mongd
  • 状態確認
# systemctl status mongd

ドキュメントにあるとおり、service コマンドでも各種操作は行えます。

# リスタートの実行例。結局、systemctl 経由で ってメッセージがでてますね...
[root@mongodb01 ~]# service mongod restart
Restarting mongod (via systemctl):                         [  OK  ]
[root@mongodb01 ~]# 
  • 自動起動設定 本題の自動起動設定ですが、systemctl でenable を行おうとすると、エラーがでます。なので、ここは、init の仕組みを使うのだと判断。従来の、chkconfig を使って設定します。
# chkconfig mongod on
# NG
[root@mongodb01 ~]# systemctl enable mongod
mongod.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mongod on
[root@mongodb01 ~]# 

# OK
[root@mongodb01 ~]#  chkconfig mongod on
[root@mongodb01 ~]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

mongod          0:off   1:off   2:on    3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@mongodb01 ~]# 

centos のパラメータ調整

CentOSの各種設定がデフォルトのままだと、mongoコマンドを実行した時に、警告メッセージが表示されます。なお、環境の状態/前提によってメッセージが違うのかもしれないので、参考情報としてください。また、下記以外の警告メッセージが表示される場合は、個別に対応が必要となると思います。

# 私の環境で表示されたメッセージ
[root@mongodb01 ~]# mongo
MongoDB shell version: 3.2.4
connecting to: test
Server has startup warnings: 
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] 
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] 
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] 
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 1024 processes, 64000 files. Number of processes should be at least 32000 : 0.5 
times number of files.
2016-04-03T21:27:52.527+0900 I CONTROL  [initandlisten] 
> q
2016-04-03T21:28:15.700+0900 E QUERY    [thread1] ReferenceError: q is not defined :
@(shell):1:1

> 
  • WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. ...
  • WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. ...

上記2つは、transparent hugepage に関連する設定で、いずれも、never ( default = always ) に設定するのがお勧めのようです。なぜそうなのか...は、改めて調べてみようと思います。設定の仕方は、色々あるようですが、私は、hmitrさんの記事を拝見し、そのままつかわせていただきました。

qiita.com

/etc/rc.local に、下記を追記(互換性配慮、すばらしい!)

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi   
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi  

尚、一点注意が必要で、centos7では、rc.localのデフォルトパーミッションが644になっています。なので、rc.localを使用して設定を行う場合、OS起動時に設定を有効とするためには、/etc/rc.d/rc.local に実行パーミッションを設定します。

# chmod -x /etc/rc.d/rc.local
  • WARNING: soft rlimits too low. こちらは、ファイルのオープン可能数が小さすぎるという事のようです。公式ドキュメントでは、/etc/security/limits.d/99-mongodb-nproc.conf を作成して設定せよとあるので、下記の様にしました。

UNIX ulimit Settings — MongoDB Manual 3.2

[root@mongodb01 ~]# cat /etc/security/limits.d/99-mongodb-nproc.conf 
*          soft    nproc     1024
root       soft    nproc     unlimited
mongod       soft    nproc     unlimited

*          soft    nofile    64000
*          hard    nofile    64000
[root@mongodb01 ~]# 

尚、mongdb のプロセスオーナーは、mongod のようなので、root,mongod 以外のアカウントには、nproc = 1024の制限を掛けたまま、unlimited とするようにしました。

[root@mongodb01 ~]# ss -lntp
State       Recv-Q Send-Q                                               Local Address:Port                                                              Peer Address:Port              
LISTEN      0      128                                                      127.0.0.1:27017                                                                        *:*                   users:(("mongod",pid=2512,fd=6))

CentOS の各種設定を有効化させるため、テストも兼ねてOSを再起動します。

# systemctl reboot

mongodb の起動とアクセス

OSが起動してきたら、mongdは自動的に起動されているので、mongoコマンドで接続してみます。

[user01@mongodb01 ~]$ mongo
MongoDB shell version: 3.2.4
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
> 

ここまでの作業で、mongodb のCentosへのインストールとセットアップ、起動するまでが完了しました。mongodb の利用については、何か面白い実験やプロトタイプができたら、改めて紹介したいと思います。特に、性能特性ですかねぇ。

それでわ。

Flask セットアップ手順のメモ

Python Flask で、Web APPプラットフォームを整る手順。(事前のセットアップは除く)

1. プロジェクトディレクトリの作成

$ mkdir <Project Name>
$ cd <Project Name>

2. Virtualenv環境の作成

$ virtualenv <v-env Name>
$ source <v-env Name>/bin/activate
(v-env Name) $

3. Flask のインストール

(v-env Name) $ pip install -U Flask       ## -U は、パッケージのUpdate Replace

4. その他、サブディレクトリの作成(暫定)

ディレクトリ構成は、どのようにあるべきかよくわからない。ここは、要調査。気になることは、セキュリティー面と、ファイルの管理性。

(v-env Name) $ mkdir templates
(v-env Name) $ mkdir static

## ディレクトリツリー
(Project Top)
├──  # 本体の.pyファイルを配置する場所。
├── (v-env Name)
│   └──  # Virtualenv の仮想環境が配置される。
├── static
│   └──  # スタイルシートを配置する場所
└── templates
    └──  # htmlファイルのテンプレートを配置する場所

以降、コーディング

(参考) Flask の起動方法

(v-env Name) $ pwd
(Project Top)
(v-env Name) $ python <Python Program>.py   ## 当然、Flask をimport して書かれているコード. 
                                            ## Port は、ローカルホストのみ、リッスン。
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: XXX-XXX-XXX

反省:shell script で、インクリメントにexpr を使っていた件...

ちょっと調査をしていて、Linux 環境上で、実験をしようと思い、簡単なシェルを書いて動かしてみたところ、思った以上に時間がかかってしまいました。何故だろうと思い、pertコマンドを使って調べてみたところ、添字で使っていた変数のインクリメント処理で、expr を使っているのが、処理コストが高いということが判明。

なにも考えずに、何年も使ってきただけに、これはイカンと反省しました。

実験の目的は、RDBMSなり、KVSなりにデータをinsertする処理の性能(TPS)を測定しようとした時に、おそらくテキストデータにinsertする以上の性能はでないのではないかと思ったので、実現したい性能は、果たして現実的なものなのかどうか?というのを実験するために、下記の様なシェルを用意して実行しました。

#!/bin/sh

### iostat.sh

cnt=0;
datestring=`date`;

while [ $cnt -le 85000 ];
do
    echo "$datestring:$cnt:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" >> output.dat
    cnt=`expr $cnt + 1`
done

下記が実行結果。

$ time ./iotest.sh 

real    0m44.039s
user    0m7.543s
sys 0m31.058s
$ 

目標としては、1秒間で数万レコードのinsert を受け付けられるような仕組みを作りたかったので、これでは流石に話になりません。が、time のレポートから、sysが妙に高いのが気になりました。なにゆえ?個人的には、userモードで殆ど動く外だし、文字列も小さいので、それ程、IOに跳ね返りがあるとも思えなかったので、気になってperfコマンドで調べてみました。

perfコマンドでレポート出力(上位)

Samples: 25K of event 'cpu-clock', Event count (approx.): 6361750000
Overhead  Command    Shared Object      Symbol
   5.95%  expr       libc-2.22.so       [.] _dl_addr
   5.66%  expr       [kernel.kallsyms]  [k] finish_task_switch
   5.17%  expr       ld-2.22.so         [.] do_lookup_x
   4.79%  iotest.sh  [kernel.kallsyms]  [k] perf_event_exec
   4.68%  expr       [kernel.kallsyms]  [k] __do_page_fault
   3.12%  expr       ld-2.22.so         [.] _dl_relocate_object
   3.02%  expr       [kernel.kallsyms]  [k] unmap_single_vma

添字のインクリメントで使っているexprの処理コストが高いんだと...処理の大半が、SYSで使われていて、高コスト処理がexpr であるということで、このやり方が良くないということに初めて気がつきました。 ということで、bashの組み込み?の和算方法に、書き方を次の様に変更

#!/bin/sh

### iotest.sh

cnt=0;
datestring=`date`;

while [ $cnt -le 85000 ];
do
    echo "$datestring:$cnt:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" >> output.dat
    cnt=$((cnt+1))
done

再度計測してみると。

$ time ./iotest.sh 

real    0m1.729s
user    0m1.354s
sys 0m0.260s
$ 

ということで、1秒には届きませんが、最初のものより25倍程度、処理が高速になりました。ちなみに、インクリメントの方法を変えた上での、perfの出力は、次のようになりました。

Samples: 2K of event 'cpu-clock', Event count (approx.): 612000000
Overhead  Command    Shared Object      Symbol
   7.80%  iotest.sh  libc-2.22.so       [.] _int_free
   7.23%  iotest.sh  libc-2.22.so       [.] _int_malloc
   5.47%  iotest.sh  libc-2.22.so       [.] malloc
   3.55%  iotest.sh  bash               [.] dequote_string
   2.78%  iotest.sh  bash               [.] unquoted_glob_pattern_p
...

これ以上、早くするのであれば、シェルを違うものに変えれば、結果は変わってきそうですが、現状を仮想マシン上で実行している事を勘案して、一旦、あまりに無理な事をやろうとしている訳ではなさそうだと言う感触を得ることができました。

まとめると、shell script で変数の四則演算をする時は、expr ではなく、$((value [+-*/] value)) で行うのがいいのだという事がわかりました。多分、本来はこのやり方だと思われるので、なんとも、はずかしい...しかし、自分は何故、exprを使う方法で、計算していたのでしょう...(Bourne Shellには、この方法しかなかった??)

その他、perf の使い方を備忘の為。

# プロファイルデータの取得
$ perf record <<command>>

# レポートの表示
$ perf report 

Python 疑問メモ

Python で疑問に思ったことをメモしておきます。このまま放置されるかもね...

 

  • virtualenv を使って、python の実行環境を分けた時、その環境に併せて作成したソースコードは、どこにおくべきか?
    環境を分けるのは、それに合わせたコードの書き方をすることになると思うので、当然、環境とコードはセットになるんだと思います。なので、virtualenv で作ったディレクトリ配下に、コード用のサブディレクトリを作成して置いておくというのが正しいのではないかと思うのだけど...
    virtualenv に関しては、下記のページで丁寧に説明されていました

     

    HDE BLOG

    Python Virtualenv で環境構築の自動化

    2016/01/02 00:29

    今日のPython: VIRTUALENV について

    Python Virtualenv の説明

    2016/01/02 00:31

     で、答えなのかわかりませんが、プロジェクトのトップディレクトリ配下に、virtualenv で環境を内包させるというのが、一つのやり方の模様。

     

    FLask Framework Tutorials and Examples

    これも、Google+Pythonコミュニティーからのフィードバック。たすかります^^

    2016/01/02 01:53

     


    なるほどなるほど〜。たしかに、eclips でjava のプロジェクト作った時は、トップがプロジェクトで、ライブラリとかはサブディレクトリに起きましたものね。「環境」という言葉のイメージで、どうしても、環境>プロジェクト>機能 みたいなイメージで考えてしまってました。

はじめまして!

皆様はじめまして。

タラキと申します。

Blog、マメに更新するのは凄く苦手なので、ちゃんとやっていけるかわかりませんが、ふと記事を残してみようと思い、アカウントを作成してみました。

よろしくお願いします。

 

さて、ざっくりプロファイルですが、私は、IT業界に身を置き、これまで15年ほどシステムインフラ中心に、仕事を対応してきたエンジニアです。

インフラ中心といっても、設計/構築サービスに特化してきましたので、システムとしてやりたい事をインフラ観点で実現したり(アプリケーション開発チームと役割分担)、構築プロジェクトで何らか問題があった時に、原因調査や解決策の検討を行ったりと、割と短いスパンでシステムに関わっていることが多いポジションです。

ほとんどシステム運用や維持管理といったことには、携わらず、また、プログラミング言語によるシステム開発の経験もありません。

もうかれこれ、15年もIT業界に身を置いているわりに、あんまりITの事に詳しくなかったりするので、これを気に、先何年もITエンジニアとしてやっていけるようにありたいなと感じています。

 

ということで、節目(?)の15年。もう一度、ITに入門するんだという意味を込めて、このサイト「俺>リーブート」で、見たこと、知ったこと、思ったことなどをまとめていきたいと思います。

せめて、自分にとって利用価値のあるサイトにできたらなと思います。

 

閲覧いただきました皆様、暖かい目で見ていただければと思います。また、コメントもどんどん頂けると助かります。