kumama go言語とかgolangとかGAEとかネットサービスとかその他色々・・・

15Feb/110

Python simple_server tuning

 GAE/PythonでごそごそやってますがたまーにGAEじゃ出来ない事をしたくなるときが有ります。ローカルのデバイス操作したりファイルごにょごにょしたり。そんな時は…Apache入れてmod_wsgi入れて…って言うのが王道にも思いますが結構大変。いっそのことdev_appserverで逃げようかとか思ったりもするもののライセンスも良く解からん上、シングルスレッド動作のwebサーバなので気が引けます。
 で、Pythonに漏れなく付いてくるwsgiref.simple_serverとbottle+sqlalchemy/sqlite+flaskで落ち着いてたんですがやっぱりパフォーマンスが…。って事でちょっとぐぐる先生に聞いてみるとこんなページを紹介されるのでした。

Nicholas Piël » Benchmark of Python Web Servers

すげー、その調査力に感服。って違うry

 gevent/libeventが良いですね~。wsgiref.simple_serverだと 2.6TPS エラー有りまくりだったアプリを試しにgevent.wsgi.WSGIServerにするとそれだけで13.7TPS!エラーも無しといい感じ。なんですが個人的なホーム鯖でgevent/libeventは流石にやり杉な雰囲気です。お試しはLinuxでやってますが諸事情からホーム鯖はWindowsです(ドライバがWindowsしかない…)。Internet公開もしないしってことでもうちょっとwsgiref.simple_serverで頑張ってみることにします。

そもそもシングルスレッドを何とかします。

from SocketServer import ThreadingMixIn

class ThreadingWsgiServer(ThreadingMixIn, WSGIServer):
pass

class ThreadingWSGIRefServer(ServerAdapter):
def run(self, handler): # pragma: no cover
from wsgiref.simple_server import make_server, WSGIRequestHandler
if self.quiet:
class QuietHandler(WSGIRequestHandler):
def log_request(*args, **kw): pass
self.options['handler_class'] = QuietHandler
self.options['server_class'] = ThreadingWsgiServer
srv = make_server(self.host, self.port, handler, **self.options)
srv.serve_forever()

bottle.run( server=ThreadingWSGIRefServer, host='0.0.0.0', port=8080,
interval=1, reloader=False, quiet=True )

ついでにログ抑制もやってみたり。後、Windowsだと特に遅くなるクライアントIPアドレスのDNSリバースlookupをhttp://bugs.python.org/issue6085を参考に外します。まー、ログ出さないなら外す必要も無いんですが、出す出さないでパフォーマンスの変化を見るために一応。

def _bare_address_string(self):
host, port = self.client_address[:2]
return '%s' % host

import BaseHTTPServer
BaseHTTPServer.BaseHTTPRequestHandler.address_string = \
_bare_address_string

ぐぐる先生はこんなの↓も教えてくれましたがこれはちょっとやり杉。

def getfqdn(name=''):
return name
import socket
socket.getfqdn=getfqdn

quiet=Falseで8.4TPS、quiet=Trueで 10.9TPSって所まで改善。5倍差があると流石にgeventしかないなと思うものの2倍差も無いところまでくるとまーgevent使うことも無いなに変わるから不思議。ログ出すとパフォーマンスは悪くなりますがまぁ良いかと思えなくも無いのでとりあえず出す感じで。

8Feb/110

英語で読もう

GAE(Google App Engine)上のTwitterクライアント、一つ放置してた問題に対応。それはsearch apiの回数制限。他のAPIはユーザベースでrate limitされているのでログインしていればAPI制限に引っかかる事はまずないんだけど、search apiだけはTwitter側でリクエスト元のIPアドレスベースでrate limitしている・・・のでGAEのインスタンス共有している他ユーザーがsearch api叩きまくってるとすぐにlimitにひかっかる。ちょっとネットを彷徨った感じsearch apiだけは別鯖へproxyしろっていうのがgoogle様のお告げの様でその様に。
とはいえ別鯖ってOpenProxy使うって訳にも行かないのでVPSに飛ばしてと思ってたら…という所で本題。

 VPS上(つまりこのサーバ)ではapacheが上がってます。apacheのmod_proxy辺りでGAEから受けてsearch.twitter.comへ転送しても良いんだけどmod_proxyは一般的かつ便利なだけにまじめに設定しないと穴になることも多く…と避けて単純にstoneで転送させる方針で=つまりapacheの80番ポートとは別ポートで。と思ったらGAEのurlfetchのドキュメントに以下書かれてます。

URL は、HTTP(80)および HTTPS(443)の標準ポートを使用しなければなりません。ポートはスキーマによって決まりますが、ポートがスキーマの標準である限り、URL で指定することもできます(https://...:443/)。アプリケーションはリモート ホストの任意のポートに接続することはできません。また、スキーマの非標準ポートを使用することもできません。

うーん、と思って早半年(笑)ふと思い立って英語のドキュメントを見ると。

An app can fetch a URL using HTTP (normal) or HTTPS (secure). The URL specifies the scheme to use: http://... or https://...
The URL to be fetched can use any port number in the following ranges: 80-90, 440-450, 1024-65535. If the port is not mentioned in the URL, the port is implied by the scheme: http://... is port 80, https://... is port 443.

なんじゃそりゃー。という事でtweepyのsearch apiの投げ先をここにしてstoneをほにゃっ※1て無事search復活。長い半年でしたwwwww

4Jul/100

求ム:挑戦者w

ガラケー用の twitter クライアントweb作っています。
一応DoCoMoで動いてますがAUとかSBMで試してもらえると助かります。

ま、ほかの既存の携帯向けサービスでも良いんだけど、
アイコンとか要らんから軽くしてくれというかそういう方向性で。

ほぼtwitter本家のmobile webのパクリです。
ただコメント付きRTというかQT?しやすくしてたりしゃべりやすい対応を入れてたり。
自分が使いやすいようにちょっと機能追加したかんじ。

http://t.kumama.org/ ::tw mode

自分のガラケーSO703iでのみ動作確認していますが、
たぶんAUでもSBでもほとんどの携帯で大丈夫なはず。
なんせSO703i、3年前のモデルですからwww

ソース公開していて http://code.google.com/p/twmode/

GAEってGoogle App Engine使ってるんでQuotaまではかなり行けるはず。
App Engineのwebappとかtemplateとかtemplateのcustom filterとか
tweepyとかdeferred.delayとか使ってるので、
その辺のサンプルにも良いかも。

iphone 4白出たらMNPしますがそれまでの延命用ってことで。

Filed under: app engine No Comments
28Feb/100

GAE::GoogleAppEngineLauncherのpythonパス

OSX SnowLeopardでGoogleAppEngineLauncher使うときはPythonを2.5系に設定し直すのは前に書いたけど、今日サブマシンの方で設定変えようとして何度入力しても設定反映のために再起動すると消えて居て反映されないという・・・。

ちょっと調べてみると
Issue 1 - google-appengine-mac-launcher - Python path has no apparent effect - Project Hosting on Google Code
に書いて有るとおり、Python2.5のパス入れた後にEnterキー押さないと忘れるらしい・・・。

しかもissue #1ってorz

Filed under: app engine No Comments
15Feb/100

GAEのdev_app_serverでURLFetchでのタイムアウト回避

GAEのproxy対応でOKなんだけど、
Proxyが遅くてタイムアウトする場合・・・

urlfetch_stub.py の _API_CALL_DEADLINE = 30.0 とかにする。

# Android2.1も試したいものの・・・

Filed under: app engine No Comments