Дипломная работа студента 5 курса

Вид материалаДиплом

Содержание


3.2.2 Серверная часть
Оптимизация очереди выполнения задач
Выполнение задач на сервере
Список использованных источников
Серверная часть
Клиентская часть
Подобный материал:
1   2   3   4   5   6   7

3.2.2 Серверная часть



Серверная часть отвечает за выполнением задач на кластере. Она была реализована в виде исполняемого файла и написана на Visual Basic .Net с использованием технологий MySQL. Программа имеет возможности: опроса состояния кластера с внесением этой информации в базу данных, оптимизации очереди выполнения задач и непосредственно выполнение программ на вычислительной кластерной системе.

Оптимизация очереди выполнения задач:

Public Sub Optimizer()

Dim myConnString As String = "Database=information;Data Source=localhost;User Id=tol;Password=tol"

Dim mySelectQuery As String = "SELECT MIN(ID), MAX(ID) FROM files"

Dim myConnection As New MySqlConnection(myConnString)

Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)

myConnection.Open()

Dim myReader As MySqlDataReader

myReader = myCommand.ExecuteReader()

While myReader.Read()

MinID = myReader.GetInt32(0)

MaxID = myReader.GetInt32(1)

End While

myReader.Close()

Dim id As Integer = MinID

Dim Queue, FierstID, SecondID, Comp1, Comp2 As Integer

Comp1 = 0

Queue = 1

For i As Integer = MinID To MaxID

mySelectQuery = "SELECT Comp FROM files WHEREUPDATE files SET Queue =" & Queue & " WHEREUPDATE files SET Queue =" & Queue & " WHEREDatabase=information;Data Source=localhost;User Id=tol;Password=tol"

While True

For i As Integer = MinID To MaxID

Dim mySelectQuery As String = "SELECT Comp, Process, directory, FileName, Parametrs, Time FROM files WHERE Queue =" & Queue

Dim myConnection As New MySqlConnection(myConnString)

Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)

myConnection.Open()

Dim myReader As MySqlDataReader

myReader = myCommand.ExecuteReader()

Dim j As Integer = 0

While myReader.Read()

datarecordsint(j, 0) = myReader.GetInt32(0)

datarecordsint(j, 1) = myReader.GetInt32(1)

datarecordsstr(j, 0) = myReader.GetString(2)

datarecordsstr(j, 1) = myReader.GetString(3)

datarecordsstr(j, 2) = myReader.GetString(4)

datarecordsint(j, 2) = myReader.GetInt32(5)

j = j + 1

End While

myReader.Close()

myConnection.Close()

Dim MaxTime As Integer = 0

For k As Integer = 0 To j - 1

MaxTime = Math.Max(MaxTime, datarecordsint(k, 2))

Next k

Dim message As String = ""

For k As Integer = 1 To j

Dim str As String = " -np 2 icpi.exe"

Dim _pi As New ProcessStartInfo("mpiexec", str)

_pi.UseShellExecute = False

_pi.RedirectStandardInput = True

_pi.RedirectStandardOutput = True

_pi.WorkingDirectory = "C:\Inetpub\wwwroot\cluster\usersdirectory\" & datarecordsstr(k - 1, 0) & "\"

Dim _pr As Process = Process.Start(_pi)

Thread.Sleep(MaxTime * 1)

message = _pr.StandardOutput.ReadToEnd

Dim path As String = "C:\Inetpub\wwwroot\cluster\usersdirectory\" & datarecordsstr(k - 1, 0) & "\" & datarecordsstr(k - 1, 1) & ".txt"

Dim fi As FileInfo = New FileInfo(path)


If fi.Exists = False Then

'Create a file to write to.

Dim sw As StreamWriter = fi.CreateText()

sw.WriteLine(message)

sw.Flush()

sw.Close()

End If

Next

Dim myDeleteQuery As String = "DELETE FROM files WHERE Queue =" & Queue

Dim myCommand1 As New MySqlCommand(myDeleteQuery, myConnection)

myConnection.Open()

myCommand1.ExecuteNonQuery()

myConnection.Close()

Queue = Queue + 1

Next

Optimizer()

End While

End Sub


ЗАКЛЮЧЕНИЕ

В ходе проделанной работы были изучены системы удалённого управления кластеров (МВС-1000 (российской разработки) и СКИФ (совместной белорусско-российской разработки)).

Была разработана и реализована система удалённого управления на базе существующего вычислительного кластера. В разработке были задействованы такие технологии как: ASP.Net, Microsoft .Net Framework 1.1, MySQL.

Для самой системы было реализовано безопасность соединения (аутентификация); скачивание, удаление и закачивание файлов на сервер; компилирование исходных кодов, постановка задач на выполнение в очередь, оптимизация очереди и непосредственно запуск задач на существующем кластере.

Данная работа может использоваться в дальнейшем совместно с другими обучающими системами, а так же на других более сложных вычислительных системах.


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
  1. Современные суперкомпьютеры: состояние и перспективы: ссылка скрыта
  2. O'Reilly - Programming Visual Basic .NET, Second Edition. ISBN: : 0-596-00438-9, 800 Pages, April 2003



Приложение А

Исходные коды программ

Серверная часть:

Imports MySql.Data.MySqlClient

Imports System.IO

Imports System.Threading

Public Class Form1

Inherits System.Windows.Forms.Form

Dim MinID, MaxID As Integer

#Region " Windows Form Designer generated code "


Public Sub New()

MyBase.New()


'This call is required by the Windows Form Designer.

InitializeComponent()


'Add any initialization after the InitializeComponent() call


End Sub


'Form overrides dispose to clean up the component list.

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub


'Required by the Windows Form Designer

Private components As System.ComponentModel.IContainer


'NOTE: The following procedure is required by the Windows Form Designer

'It can be modified using the Windows Form Designer.

'Do not modify it using the code editor.

Friend WithEvents Button1 As System.Windows.Forms.Button

Friend WithEvents Button2 As System.Windows.Forms.Button

Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem

Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem

Friend WithEvents ContextMenu1 As System.Windows.Forms.ContextMenu

Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem

Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon

Friend WithEvents MenuItem4 As System.Windows.Forms.MenuItem

Friend WithEvents MenuItem5 As System.Windows.Forms.MenuItem

Friend WithEvents Timer1 As System.Windows.Forms.Timer

Private Sub InitializeComponent()

Me.components = New System.ComponentModel.Container

Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))

Me.Button1 = New System.Windows.Forms.Button

Me.Button2 = New System.Windows.Forms.Button

Me.MainMenu1 = New System.Windows.Forms.MainMenu

Me.MenuItem1 = New System.Windows.Forms.MenuItem

Me.MenuItem2 = New System.Windows.Forms.MenuItem

Me.ContextMenu1 = New System.Windows.Forms.ContextMenu

Me.MenuItem4 = New System.Windows.Forms.MenuItem

Me.MenuItem5 = New System.Windows.Forms.MenuItem

Me.MenuItem3 = New System.Windows.Forms.MenuItem

Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon(Me.components)

Me.Timer1 = New System.Windows.Forms.Timer(Me.components)

Me.SuspendLayout()

'

'Button1

'

Me.Button1.Location = New System.Drawing.Point(24, 8)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(80, 24)

Me.Button1.TabIndex = 0

Me.Button1.Text = "Старт"

'

'Button2

'

Me.Button2.Location = New System.Drawing.Point(144, 8)

Me.Button2.Name = "Button2"

Me.Button2.Size = New System.Drawing.Size(80, 24)

Me.Button2.TabIndex = 1

Me.Button2.Text = "Стоп"

'

'MainMenu1

'

Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})

'

'MenuItem1

'

Me.MenuItem1.Index = 0

Me.MenuItem1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem2})

Me.MenuItem1.Text = "Файл"

'

'MenuItem2

'

Me.MenuItem2.Index = 0

Me.MenuItem2.Shortcut = System.Windows.Forms.Shortcut.CtrlE

Me.MenuItem2.Text = "Выход"

'

'ContextMenu1

'

Me.ContextMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem4, Me.MenuItem5, Me.MenuItem3})

'

'MenuItem4

'

Me.MenuItem4.Index = 0

Me.MenuItem4.Text = "Старт"

'

'MenuItem5

'

Me.MenuItem5.Index = 1

Me.MenuItem5.Text = "Стоп"

'

'MenuItem3

'

Me.MenuItem3.Index = 2

Me.MenuItem3.Shortcut = System.Windows.Forms.Shortcut.CtrlE

Me.MenuItem3.Text = "Выход"

'

'NotifyIcon1

'

Me.NotifyIcon1.ContextMenu = Me.ContextMenu1

Me.NotifyIcon1.Icon = CType(resources.GetObject("NotifyIcon1.Icon"), System.Drawing.Icon)

Me.NotifyIcon1.Text = "NotifyIcon1"

Me.NotifyIcon1.Visible = True

'

'Form1

'

Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

Me.ClientSize = New System.Drawing.Size(248, 42)

Me.ContextMenu = Me.ContextMenu1

Me.Controls.Add(Me.Button2)

Me.Controls.Add(Me.Button1)

Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle

Me.MaximizeBox = False

Me.Menu = Me.MainMenu1

Me.MinimizeBox = False

Me.Name = "Form1"

Me.Text = "Cluster"

Me.ResumeLayout(False)


End Sub


#End Region


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Optimizer()

GoJobs()

End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


End Sub


Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click

Close()

End Sub


Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click

Close()

End Sub


Public Sub Optimizer()

Dim myConnString As String = "Database=information;Data Source=localhost;User Id=tol;Password=tol"

Dim mySelectQuery As String = "SELECT MIN(ID), MAX(ID) FROM files"

Dim myConnection As New MySqlConnection(myConnString)

Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)

myConnection.Open()

Dim myReader As MySqlDataReader

myReader = myCommand.ExecuteReader()

While myReader.Read()

MinID = myReader.GetInt32(0)

MaxID = myReader.GetInt32(1)

End While

myReader.Close()

Dim id As Integer = MinID

Dim Queue, FierstID, SecondID, Comp1, Comp2 As Integer

Comp1 = 0

Queue = 1

For i As Integer = MinID To MaxID

mySelectQuery = "SELECT Comp FROM files WHEREUPDATE files SET Queue =" & Queue & " WHEREUPDATE files SET Queue =" & Queue & " WHEREDatabase=information;Data Source=localhost;User Id=tol;Password=tol"

While True

For i As Integer = MinID To MaxID

Dim mySelectQuery As String = "SELECT Comp, Process, directory, FileName, Parametrs, Time FROM files WHERE Queue =" & Queue

Dim myConnection As New MySqlConnection(myConnString)

Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)

myConnection.Open()

Dim myReader As MySqlDataReader

myReader = myCommand.ExecuteReader()

Dim j As Integer = 0

While myReader.Read()

datarecordsint(j, 0) = myReader.GetInt32(0)

datarecordsint(j, 1) = myReader.GetInt32(1)

datarecordsstr(j, 0) = myReader.GetString(2)

datarecordsstr(j, 1) = myReader.GetString(3)

datarecordsstr(j, 2) = myReader.GetString(4)

datarecordsint(j, 2) = myReader.GetInt32(5)

j = j + 1

End While

myReader.Close()

myConnection.Close()

Dim MaxTime As Integer = 0

For k As Integer = 0 To j - 1

MaxTime = Math.Max(MaxTime, datarecordsint(k, 2))

Next k

Dim message As String = ""

For k As Integer = 1 To j

Dim str As String = " -np 2 icpi.exe"

Dim _pi As New ProcessStartInfo("mpiexec", str)

_pi.UseShellExecute = False

_pi.RedirectStandardInput = True

_pi.RedirectStandardOutput = True

_pi.WorkingDirectory = "C:\Inetpub\wwwroot\cluster\usersdirectory\" & datarecordsstr(k - 1, 0) & "\"

Dim _pr As Process = Process.Start(_pi)

Thread.Sleep(MaxTime * 1)

message = _pr.StandardOutput.ReadToEnd

Dim path As String = "C:\Inetpub\wwwroot\cluster\usersdirectory\" & datarecordsstr(k - 1, 0) & "\" & datarecordsstr(k - 1, 1) & ".txt"

Dim fi As FileInfo = New FileInfo(path)


If fi.Exists = False Then

'Create a file to write to.

Dim sw As StreamWriter = fi.CreateText()

sw.WriteLine(message)

sw.Flush()

sw.Close()

End If

Next

Dim myDeleteQuery As String = "DELETE FROM files WHERE Queue =" & Queue

Dim myCommand1 As New MySqlCommand(myDeleteQuery, myConnection)

myConnection.Open()

myCommand1.ExecuteNonQuery()

myConnection.Close()

Queue = Queue + 1

Next

Optimizer()

End While

End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


Dim Reply As ICMP_ECHO_REPLY

Dim lngSuccess As Long

Dim strIPAddress As String


'Get the sockets ready.

If SocketsInitialize() Then


'Address to ping

strIPAddress = "10.144.50.60"


'Ping the IP that is passing the address and get a reply.

lngSuccess = ping(strIPAddress, Reply)


'Display the results.

Debug.Write("Address to Ping: " & strIPAddress)

Debug.Write("Raw ICMP code: " & lngSuccess)

Debug.Write("Ping Response Message : " & EvaluatePingResponse(lngSuccess))

Debug.Write("Time : " & Reply.RoundTripTime & " ms")


'Clean up the sockets.

SocketsCleanup()


Else


'Winsock error failure, initializing the sockets.

Debug.Write(WINSOCK_ERROR)


End If


End Sub

End Class


Клиентская часть:

SessionSequencer.vb

Imports System.Web

Public Class SessionSequencer

Private expectedPage As String

Private requestedPage As String

Private sequenceIndex As Integer

Private sequence() As String = {"login.aspx", "general.aspx"}

Private Request As HttpRequest

Private Response As HttpResponse

Private Session As SessionState.HttpSessionState

Public Sub New()

Request = HttpContext.Current.Request

Response = HttpContext.Current.Response

Session = HttpContext.Current.Session

If Session("sequenceIndex") Is Nothing Then

Session("sequenceIndex") = 0

End If

sequenceIndex = Session("sequenceIndex")

requestedPage = Request.ServerVariables("SCRIPT_NAME").ToLower

requestedPage = requestedPage.Substring(requestedPage.LastIndexOf("/") + 1)

If sequenceIndex < 0 Or sequenceIndex > sequence.GetUpperBound(0) Then

sequenceIndex = 0

End If

expectedPage = sequence(sequenceIndex)

If requestedPage <> expectedPage Then

Response.Redirect(expectedPage)

End If

End Sub

Public Sub showSessionVars()

Dim aKey As String

For Each aKey In Session.Keys

Response.Write(aKey & "=" & Session.Item(aKey) & "
")

Next

End Sub

Public Sub NextPage()

If sequenceIndex + 1 < sequence.GetLength(0) Then

sequenceIndex += 1

Else

sequenceIndex = sequence(sequence.GetUpperBound(0))

End If

Session("sequenceIndex") = sequenceIndex

Session("sequence") = sequence(sequenceIndex)

Response.Redirect(sequence(sequenceIndex))

End Sub

End Class


Login.vb

Public Class WebForm6

Inherits System.Web.UI.Page


#Region " Web Form Designer Generated Code "


'This call is required by the Web Form Designer.

Private Sub InitializeComponent()


End Sub

Protected WithEvents Label1 As System.Web.UI.WebControls.Label

Protected WithEvents TxtUserName As System.Web.UI.WebControls.TextBox

Protected WithEvents UsernameValidator As System.Web.UI.WebControls.RegularExpressionValidator

Protected WithEvents Label2 As System.Web.UI.WebControls.Label

Protected WithEvents TxtPassword As System.Web.UI.WebControls.TextBox

Protected WithEvents Button1 As System.Web.UI.WebControls.Button

Protected WithEvents PasswordValidator As System.Web.UI.WebControls.RegularExpressionValidator

Protected WithEvents HyperLink1 As System.Web.UI.WebControls.HyperLink

Protected WithEvents HyperLink2 As System.Web.UI.WebControls.HyperLink

Protected WithEvents loginFieldValidator1 As System.Web.UI.WebControls.RequiredFieldValidator

Protected WithEvents passFieldValidator As System.Web.UI.WebControls.RequiredFieldValidator

Protected WithEvents label3 As System.Web.UI.WebControls.Label

Protected WithEvents HyperLink3 As System.Web.UI.WebControls.HyperLink


'NOTE: The following placeholder declaration is required by the Web Form Designer.

'Do not delete or move it.

Private designerPlaceholderDeclaration As System.Object


Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init

'CODEGEN: This method call is required by the Web Form Designer

'Do not modify it using the code editor.

InitializeComponent()

End Sub


#End Region


Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Put user code to initialize the page here

Dim SessionSequencer As New SessionSequencer

label3.Text = ""

If IsPostBack Then

Page.Validate()

If Page.IsValid Then

Dim str As String

Dim myConnString As String = "Database=information;Data Source=localhost;User Id=tol;Password=tol"

Dim mySelectQuery As String = "SELECT password, directory FROM usersinfo WHERE login ='" & TxtUserName.Text & "'"

Dim myConnection As New MySqlConnection(myConnString)

Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)

myConnection.Open()

Dim myReader As MySqlDataReader

myReader = myCommand.ExecuteReader()

Dim filedir As String

While (myReader.Read())

str = myReader.GetString(0)

filedir = myReader.GetString(1)

End While

myReader.Close()

myConnection.Close()

Session("directory") = filedir

If str = TxtPassword.Text Then

Session("username") = Me.TxtUserName.Text

Session("password") = Me.TxtPassword.Text

Call SessionSequencer.NextPage()

Else : label3.Text = "Неправильные Имя пользователя или Пароль. Введите пожалуйста данные заново."

End If

End If

End If

End Sub


' Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

' Page.Validate()

' If Page.IsValid Then

'End Sub