web-dev-qa-db-ja.com

Jenkins WebサーバーがUbuntu / Dell PowerEdge R640のHTTPリクエストに応答しない

私は、LXC(つまり、「ゲスト」)を使用して、いくつかのコンテナーを実行するシステム(「ホスト」)を持っています。私はゲストの中にJenkinsをインストールしましたが、それらは appear が意図したとおりに機能するように見えますが、ただししない要求に応答します。 (LXCを含むいくつかのJenkinsのインストールは成功しています。)この場合、観察された問題は、組み込みのJenkins Webサーバー(Jetty)がHTTPリクエストに応答していないことです。実行中のLXCゲストそのもの、つまりlocalhostを指します。

私はこの問題の解決に数日間取り組んできましたが、成功しませんでした。

localhostからJenkins Webサーバーに接続しようとすると、次のようになります。

root@base:~# curl -vI http://localhost:8080/jenkins/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> HEAD /jenkins/ HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.58.0
> Accept: */*
>

動作中の設定では、認証されていないためHTTP-403が返され、応答に1〜2秒はかかりませんが、数時間経っても応答がありません。 Jenkinsログファイルもエラーを報告しません。

Jenkinsのインストールが意図したとおりに機能し、アクセス可能になるように、この問題の根本的な原因を解決するのに助けが必要です。

この問題を見つけて修正するために何をどこで探すかについてのポインタはありますか?


これは私がすでに調べたいくつかのことです:

  • Jenkins構成:/etc/default/jenkinsの構成ファイルは、他の作業用セットアップに似ており、最小限の変更(たとえば、localhostのみへのバインド、および接頭辞)があります。
  • Apacheの構成: Apacheの逆プロキシ構成を確認し、他の稼働中のシステムと比較しましたが、問題ありませんでした。また、ApacheはLXCコンテナーの外からでも常にアクセス可能(たとえば、「It Works!」ページ)にアクセスできるため、ファイアウォールルールによってトラフィックがブロックされることはありませんでした。 Jenkinsが応答しないため、Apacheは HTTP-502 Proxy Error で失敗します。 (とはいえ、環境を簡略化するためにApacheをアンインストールしました。)
  • ログファイル:/var/log/jenkins/jenkins.logにあるJenkinsログファイルは、通常、Java例外からのスタックトレースとして表示される)問題を報告しません。
  • ファイアウォールルール(iptables -S):すべてのチェーン/ルール(INPUTFORWARD、およびOUTPUT)はACCEPTに設定されます。それでも、ここでの通信はlocalhost内にあるため、他のファイアウォールルールが適切に設定されていても、問題は発生しません。
  • ネットワークパケットとポート(netstat -tapon):予想されるポート(デフォルトは8080ですが、他のポートを試しました)で待機しているJenkins(Javaプロセス)を表示します。また、ESTABLISHEDクライアントが上記のようなリクエストを送信した後、接続を(両端で)curlとして示します。これは、成功したTCPハンドシェイクを示しています。
  • ネットワークトラフィック(tcpdump -i lo):作成された3ウェイハンドシェイクを示します。 netstatが接続をESTABLISHEDとして表示する理由を説明しています。
  • 動作設定との比較:私が作成した他のJenkinsインストールには、同様の環境と構成があります(Ubuntu 18.04ホスト、Jenkins構成ファイルへの同じ変更、インストール手順など)。
  • 問題の再現:他のシステムで問題を再現しようとしました(失敗)。私はまったく同じ環境、インストールプロセス、構成などを使用しました(たとえば、私のラップトップ、職場の別のサーバー、自宅の別のサーバー、同じLXCバージョン、一致するゲストOSイメージのフィンガープリントなど)。すべて問題なく機能します outside 問題の本番サーバー(Dell PowerEdge R640サーバー)。
  • Orbitからシステムの核を作る1私はすべてのコンテナを最初から数回破棄/再構築しました(すべてのデータが格納されているZFSプールの破棄を含む)。違いはありませんでした。
  • ホストへの直接インストール:ホストにJenkinsを直接インストールすること、つまりLXCコンテナ/ゲストの外部にインストールすることでも問題が発生することを確認しました。
  • Java/JVMを除外する:他のJavaベースのアプリケーションが正しく動作することを確認できるので、 not のように見えますJavaベースのすべてのプログラムに影響する問題。 (私は、Apache Tomcatサーバーをセットアップすることによってこれをテストしましたが、期待どおりに動作しました。)
  • ホストの再配置:データセンター環境の潜在的な問題を除外するために、サーバーを自分のデスクエリアに移動しました。そこでは、設定が機能する別のテストサーバーがあります。これは違いがありませんでした。
  • スタンドアロンJettyを実行する: Jenkinsにバンドルされているバージョンと最も近いJettyサーバーのバージョンを入手しました。問題を再現できませんでした。 stand-alone Jettyサーバーは、Jenkinsにバンドルされているものはまだ応答していませんが、期待どおりに要求に応答しました。 (JenkinsのJettyバージョンはログでjetty-9.4.z-SNAPSHOT; built: 2018-06-05T18:24:03.829Zとして報告されます。この.z-SNAPSHOTという名前のバージョンは Jetty releasesページ にないため、ビルドに基づいて最も近い一致を使用しましたこのテストの日付:9.4.11.v20180605
  • OpenJREからOracle JREに切り替える:インストール済み/使用するOracleのJREを設定(つまり、update-alternatives --config Java)。同じ非応答動作が観察されます。

私がすでに見てきたが、関連も役に立たなかった質問のいくつか:

私はこれらよりずっと多くを読みました。それらは単なるサンプルです。


1 確認する唯一の方法です...ほとんど...

3
code_dredd

TL; DR

Jenkinsをホストしているシステムに70以上CPUがある場合、Jenkins/Jettyがスタックします動作しません。 Jenkinsを実行するシステム/コンテナのCPUが70未満であることを確認するか、アップグレードしてくださいJenkinsのインストールが2.138。2になり、本日(2018-10-10)にリリースされました。


概要

Ubuntu 18.04 LTSリポジトリのJenkins 2.138。1にバグがあり、Jenkins/Jettyが70またはより多くのCPU。 Jenkins 2.138。2は2018年10月10日に本日リリースされ、いくつかの根本的な問題の修正が含まれており、そのうちの1つが実行した問題の原因でしたに。

変更ログは ここ です。私にとっての主な修正はこれです:

このバグ修正で問題が実際に修正されたことを確認でき、72 CPU搭載のサーバーでこれを確認しました。

Jenkinsインストールを(まだ)アップグレードできない場合は、潜在的な回避策を読んでください。


回避策(コンテナーの場合)

LXC内にJenkinsをインストールする場合は、次のコマンドでこれを制御できます。

  • lxc config set <container> limits.cpu N、 どこ N < 70;そして
  • lxc exec <container> -- systemctl restart jenkins.service

次のようにして、プロファイル構成を更新する必要がある場合もあります。

lxc profile set <container-profile> limits.cpu N

同じ警告がすでに上に表示されています。仮想マシン(VirtualBox、VMwareなど)を使用している場合でも、VMで使用可能なCPUの数を設定できるはずです。

P.S.:Pavelの his post に感謝します。これにより、CPU /コアの数を試すのに正しい方向に導いてくれました。

0
code_dredd

これは同じ問題のより詳細な説明です https://issues.jenkins-ci.org/browse/JENKINS-33412

以前のJenkinsバージョンでは、基になるjettyで使用されるスレッドの数が40に制限されています(handlerCountMaxオプション)。そしてデフォルトでは、jettyはセレクターにRuntime.getRuntime()。availableProcessors()/ 2スレッドを使用します。また、CPUコアの数が十分に多い(70など)か、Jetty sslコネクターも開始されており、CPUコアの数が36を超える場合、スレッドが使い果たされ、httpリクエストがスタックします。最新のjenkinsへの移行を検討し、手動でjettyのスレッド数を定義してください-これらのjettyパラメータ-qtpMaxThreadsCount、jettyAcceptorsCount、jettySelectorsCountを確認してください。

2