質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Q&A

1回答

780閲覧

Python bottleフレームワークを使用してますがメモリがどんどん溜まっていきます

Kyojiro

総合スコア6

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

0グッド

0クリップ

投稿2019/05/15 01:07

編集2022/01/12 10:55

現在、Bottleフレームワークを使用して、WEBサーバーとして(具体的には、appd.pyを)バックグラウンドでデーモンとして使用しております。処理が実行されるたび、appd.pyを経由して処理されますが、メモリがその都度どんどん増えていきます。
運用として、appd.pyのプロセスを終了させることができませんが、増えていくメモリを開放したいです。

感じたことは
・自動的にガベージコレクトがされないかもしれません
・明示的に ガベージコレクトや del を使用して開放したいのですが、最終 bottle.template に変数を連携するため、それも叶っておりません。

このことから、以下の方法について質問させてください。

質問1) bottle.template を使用していてもどこかでガベージコレクトやdel をする処理を挿入することができるかどうか?

質問2) python側で未使用のメモリを調査・抽出して、開放(削除)する方法があるのでしょうか?

質問3) サーバーの構成をWSGIなどを導入して、この問題を回避することができるのでしょうか?

今回pythonを使用してWEB環境を構築したのが初めてなもので、お力をお貸し頂けたらと思います。

■コマンドにつきまして(起動)

sh

1$ cd /var/www/htdocs/contents/ 2$ python appd.py

■appd.pyの主要なコードを記述します

Python

1from bottle import (route, template, error, response, 2 request, HTTPError, HTTPResponse, TEMPLATE_PATH, 3 abort, run, redirect, debug, Bottle, static_file) 4from beaker.middleware import SessionMiddleware 5from paste import httpserver as web 6 7import os 8import sys 9import time 10import math 11from datetime import datetime, timedelta 12import re 13session_timeout = 3600000 14session_opts = { 15 'session.type': 'file', 16 'session.timeout': session_timeout, 17 'session.cookie_expires': True, 18 'session.data_dir': './data', 19 'session.auto': True, 20 'save_accessed_time': False 21 } 22 23app = Bottle() 24apps = SessionMiddleware(app, session_opts) 25BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 26TEMPLATE_PATH.append(BASE_DIR + "/views") 27 28@app.route('/view_page/', method='GET') 29def view_page(): 30 check_login() 31 #user_id = int(request.forms.user_id) 32 33 import c_database 34 35 login = request.environ.get('beaker.session') 36 session_user_id=login.get('user_id') 37 38 db = c_database.connect_database() 39 connect = db[0] 40 cur = db[1] 41 42 sql = "SELECT uri, domain FROM user_domains WHERE user_id = %s" 43 cur.execute(sql, (session_user_id, )) 44 rows = cur.fetchone() 45 if isinstance(rows, type(None)) : 46 raise HTTPError(status=401, body="データは存在しません。") 47 else : 48 db_uri = rows[0] 49 db_domain = rows[1] 50 51 c_database.close_database(connect, cur) 52 53 return template('view_page', tp=BASE_DIR + "/views/", page_name='ページ表示', 54 uri=db_uri, 55 domain=db_domain) 56 57 58def daemon_serv(): 59 pid = os.fork() 60 try: 61 if pid != 0: 62 fd = open('./bottle.pid','w') 63 fd.write(str(pid) + '\n') 64 fd.close() 65 sys.exit() 66 67 except OSError as e: 68 sys.stderr.write("BottleFork: Failed: %d (%s)\n" % (e.errno, e.strerror)) 69 sys.exit(1) 70 71 while 1: 72 web.serve(apps, host='localhost', port=8000,daemon_threads=False,threadpool_workers=10,use_threadpool=100) 73 74 75if __name__ == "__main__": 76 daemon_serv()

■WEBからのアクセス
http://localhost:8000/view_page

※コードは主要部分だけに加工しました

■メモリについてはMonitという追加モジュールでプロセス管理をしておりまして、
Process 欄のメモリについて
memory 0.3% [101.9 MB]
memory total 0.3% [101.9 MB]

処理ごとにmemory とmemory totalが 数十MBずつ増えていきます

以上、宜しくお願い致します

▼ 2019/05/18
現在メモリを調査しておりまして、こちらの検証結果について改めてご連絡させて頂きます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/05/15 02:10

・起動方法をコマンドで具体的に示してください ・書いたコードを示してください。 ・「使用メモリが増える」と検出した方法と具体的な数値を書いてください。
guest

回答1

0

bottleを使っている割にプロセスフォークしたり別のWebサーバーを立てたりと色々やっているようですが、
何かを参考にして or 何かの理由があって複雑な構成になっているのでしょうか。

まずはシンプルにbottleフレームワークを使ってみてはどうでしょうか。

公式サイトの安定版 0.12 - https://bottlepy.org/docs/0.12/

公式サイトのHello, world!サンプルを引用します。

python

1from bottle import route, run, template 2 3@route('/hello/<name>') 4def index(name): 5 return template('<b>Hello {{name}}</b>!', name=name) 6 7run(host='localhost', port=8080)

これだけでシンプルなWebサーバーが起動するはずですよ。

投稿2019/05/15 06:26

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyojiro

2019/05/16 10:45

アドバイス有難うございます! シンプルにいちからBottleを構築してみました $ python appd_test.py で起動して、メモリを消費するような作業を数回実施し、メモリの使用量を3回確認してみたところ、どんどん増えていっていることがわかります。 # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND #user 8048 0.7 0.1 317140 37248 pts/0 S 19:28 0:10 python appd_test.py #user 8048 1.2 0.1 341732 56200 pts/0 S 19:28 0:10 python appd_test.py #user 8048 1.9 0.3 986784 113564 pts/0 S 19:28 0:10 python appd_test.py そもそもBottleのメモリ管理がどうなっているか、どう運用されているかなどご教示頂けましたら幸いです。 宜しくお願い致します
mather

2019/05/16 10:52

いや複数プロセスが発生している事自体がおかしいのです。 どんなコードを書いてどうやって起動しているのか質問を編集して追記してください。
Kyojiro

2019/05/16 13:04 編集

誤解を与えるような変な書き方で申し訳ございません。 時系列に書いてしまいました。おっしゃる通り、プロセスは1つ(PID=8048)です。 # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND #user 8048 0.7 0.1 317140 37248 pts/0 S 19:28 0:10 python appd_test.py →1回目の$ ps コマンド #user 8048 1.2 0.1 341732 56200 pts/0 S 19:28 0:10 python appd_test.py →2回目の$ ps コマンド #user 8048 1.9 0.3 986784 113564 pts/0 S 19:28 0:10 python appd_test.py →3回目の$ ps コマンド 現在メモリを調査しておりまして、こちらの検証結果についても改めてご連絡させて頂きます。
mather

2019/05/17 01:48

現在の appd_test.py の内容を質問に追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問