{'fraction_non_alphanumeric': 0.02148993762504413, 'fraction_numerical': 0.006049193833117571, 'mean_word_length': 5.207773232028054, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Load Balancing in Cloud Computing: A State of the Art Survey

Cloud computing has proposed a new perspective for provisioning the large-scale computing resources by using virtualization technology and a payper-use cost model. Load balancing is taken into account as a vital part for parallel and distributed systems. It helps cloud computing systems by improving the general performance, better computing resources utilization, energy consumption management, enhancing the cloud services’ QoS, avoiding SLA violation and maintaining system stability through distribution, controlling and managing the system workloads. In this paper we study the necessary requirements and considerations for designing and implementing a suitable load balancer for cloud environments. In addition we represent a complete survey of current proposed cloud load balancing solutions which according to our classification, they can be classified into three categories: General Algorithm-based, Architectural-based and Artificial Intelligence-based load balancing mechanisms. Finally, we propose our evaluation of these solutions based on suitable metrics and discuss their pros and cons.


I. INTRODUCTION
Cloud computing is known as a popular and important term in the IT society these days. It has emerged as a large scale distributed computing paradigm that is driven by economies of scale and provides the situation that services can be dynamically configured and delivered on demand [1,2]. To emphasize that cloud computing has some featured goals, we refer to the definition of cloud computing provided by National Institute of Standards and Technology (NIST) that says: "Cloud computing is a model for enabling convenient, on-demand network access to a shared pool of configurable computing resources (e.g., networks, servers, storage, applications, and services) that can be rapidly provisioned and released with minimal management effort or service provider interaction. This cloud model promotes availability and is composed of five essential characteristics, three service models, and four deployment models" [3,4]. As the main goal of cloud computing we can mention the better use of distributed resources and applying them to achieve a higher throughput, performance and solving large scale computing problems [5]. Generally speaking, based on the NIST definition of cloud computing we can say best effort for offering the on demand services based on the best use of available shared resources is one of the most important goals of this model. To achieve these kinds of goals, improving the general performance of system, maintain stability, availability and some other features for a cloud computing data center, we need a mechanism which is called load balancing. Load balancing is one of the central issues and challenges in distributed systems like grid-based systems and cloud computing [6]. It is still a new problem in the cloud computing that needs new architectures and algorithms to promote the traditional approaches. In cloud computing, scheduling and handling many jobs that their arrival pattern, type of service and other properties are so hard to predict cause of the dynamic on-demand network access feature of system, an efficient load balancing mechanism is so necessary to increase the Service Level Agreement (SLA), deliver a robust service and provide other essential system requirements. In addition load balancing is an important topic because it enables other important features such as scalability [6].
Many researches have been done in the field of cloud computing and different challenges that are related which includes studies about cloud computing security and privacy like researches that have been done in [7][8][9][10][11] or researches related to modeling and performance analysis in cloud environments [12][13][14][15][16], challenges related to the frameworks and architectures of cloud [17,18] and other general challenges in cloud computing such as scheduling, energy efficient and green computing and etc. Also there are many studies about load balancing in distributed and peer to peer networks [19][20][21][22][23], but a little comprehensive research about load balancing in the field of cloud computing has been done yet and we just can refer to some papers that there are in the field of load balancing in cloud computing [24][25][26][27][28]. In this paper we present a survey of the algorithms, architectures and all techniques which have proposed for cloud computing load balancing. We discuss their properties and parameters that they considered and also give a comparative view of the current real load balancing mechanisms. The rest of this paper is organized as follows. In section 2 we review the literature of load balancing and will discuss the general classifications, principles and mechanism of load balancing algorithms. We survey the challenges, issues and special points that should be taken into consideration during the designing and offering a load balancer in cloud computing in section 3. In section 4 we discuss the features, positive and negative point of current cloud load balancing approaches. In addition we will have a comparative look on some parameters which each of proposed algorithms have considered. Finally, section 5 concludes paper.

II. LOAD BALANCING LITERATURE
Technological progress in computer world and rapid developments of distributed systems over last few years caused that load balancing problem were took into consideration as a main challenge more than ever in these systems. This section presents some important concepts and approaches of load balancing mechanism. Load balancing is the process of redistributing the general system work load among all nodes of the distributed system (network links, disk drivers, central processing units…) to improve both resource utilization and job response time while avoiding a situation where some nodes are overloaded while others are under loaded or idle [29]. Load balancing is a vital and inseparable part of cloud computing and elastic scalability [30]. In order to avoid system failure, load balancing is often used by controlling the input traffic and stop sending the workload to resources which become overloaded and non-responsive. This is an inherited feature from gridbased computing which has been transferred to cloud computing [6,30]. Here, there are some important goals of load balancing mechanism which have been mentioned in different researches:  Reducing job response time while keeping acceptable delays [29]  Maintaining system stability [29]  Having fault tolerance ability (using load balancing for implementing failover) [30]  Improving the general system performance for achieving optimal resource utilization, maximum throughput and avoiding overload [31]  Improving and maintaining the availability in cloud systems [32] To start designing load balancers, there are some considerations from the point of architectural which are pointed out by [30] and we summarize them here:  Design for providing scalability that could cover all different designing level such as CPU level, machine level, and network level or even could be at the application and data center level  The ability of controlling the client requests and transfer to the selected resources according to the load balancer policies  Fault tolerance for applications  Scalability of the request handling capacity in a selforganized way  The ability of handling more complex and higher traffic There are many various kinds of load balancing mechanisms and approaches which most of the studies have been classified as two main categories [25,29,32]: static and dynamic. In static techniques [33][34][35], there are usually prior knowledge and some assumptions about the global status of the system such as job resource requirements, communication time, processing power of system nodes, memory and storage devices capacity and so on. A static approach is a kind of assignment from a set of tasks to a set of resources which can take either a deterministic or a probabilistic form [29]. In addition, this approach is defined usually in the design or implementation of systems [31]. In deterministic assignments, the extra workload of a certain node will be transferred to another specific node all of the time, but in probabilistic approaches each node sends its extra tasks with probability P to a node and with probability 1-P to another one. The main drawback of static load balancing algorithms is that the current state of the system is not considered when making the decisions and therefore it is not a suitable approach in systems such as distributed systems which most states of the system changes dynamically. Dynamic load balancing techniques take into consideration the current state of systems that their decisions are based on. In this technique tasks can move dynamically from an overloaded node to an under-loaded one and this is the main advantage of dynamic load balancing algorithms which can change continuously according to the current state of the system. However designing and implementing a dynamic load balancing algorithm is much more complicated and harder than finding a static solution, but through dynamic mechanisms we can gain a higher performance and have more accurate and efficient solutions [25,29]. Dynamic load balancing algorithms can be designed in two different ways: distributed and non-distributed. In distributed approaches e.g. [36][37][38][39], the load balancing process can be executed by all nodes in the system. In addition, in this approach all nodes can communicate with each other for achieving a global goal in the system which is called cooperative or every node can work independently for just achieving a local goal that is noncooperative form. But, in a non-distributed scheme [40][41][42][43], the responsibility of balancing the system workload would not be performed by all system nodes. In centralized approach in non-distributed scheme; a single node only can execute the load balancing mechanism among all nodes. In semi-distributed form, the system will be divided into some partitions or clusters and a single node execute the load balancing process in each partition. The dividing load balancing algorithms into two dynamic and static categories is based on the point that algorithms take into account the current state of system for making decision or not. But from another point of view that has mentioned in [31], load balancing techniques can be divided into two other general categories based on some other factors:  Based on the way that the system load is distributed and resources is assigned to the tasks (Depending on the system workload)  Based on the system topology and available information about resources The first category is designed as:  Centralized approach  Distributed approach  Mixed approach As we discussed earlier, this classification is based on the fact that who in charge of the load distributing is. The second category is designed as:  Static approach  Dynamic approach  Adaptive approach Distributed, dynamic and adaptive load balancing mechanisms of these two categories are more suitable for large scale distributed systems such as cloud computing [31]. Adaptive approach adapts the load distribution to the system status changes, by changing their parameters dynamically and even their algorithms. Figure 1 shows a general classification of load balancing algorithms and approaches based on common classifications and those which are proposed in [29,31].
From the previous discussions we find out that dynamic load balancing approaches are more suitable techniques in large scale distributed systems like grid and cloud computing. For making decision based on the current workload of system, dynamic load balancers need to know some information about the state of system. Therefore a dynamic load balancing mechanism requires some components for gathering and handling these types of information. Four main components of a dynamic load balancer have been discussed in detail in [29,44,45] and we just introduce them here:  Information strategy component: A component of dynamic load balancer is called information strategy component which is in charge of collecting information about status of resources in a system. According to the whole information which is obtained from each processing node in a distributed system, the load balancing process will be able to work efficiently. There are several methods that can collect system nodes' information. Some of the most popular methods are: Broadcasting, the centralized polling and agent. Information strategies that use broadcasting method [46][47][48], each node broadcasts its information to the system network and it will be accessible by others. In polling methods, for example [49,50], the necessary information will be gathered by using polling techniques. An agent is one of the methods used in recent years. As some examples which use agent method for gathering information to balance the workload we can refer to [51,52]. is a simple solution [54,55], a new arrived job only is selected for transferring. But in the second approach [56] an intelligent decision is made based on some parameters for selecting a job among all current nodes' jobs.  Location strategy component: It selects a destination resource and a computing node for transferring a task. There are many approaches for selecting a destination such as: Probing, Random and Negotiation. In probing approach [54], a local node usually probing the system nodes to find a suitable destination. A location strategy with random approach selects a destination node randomly [57]. Finally in negotiation approaches, nodes negotiate with each other for load balancing process [46,58]. Figure 2 summarizes the previous discussion and gives a general viewpoint of load balancing algorithms' components. Thus, these four components should be considered during designing a load balancer, based on special features of load balancer.

III. CLOUD LOAD BALANCER CHALLENGES AND CONSIDERATIONS
However cloud computing have many advances in theory and practice, researches in cloud are still in their early steps and one of the unsolved challenges is load balancing problem. Before reviewing the current load balancing approaches, we discuss the main challenges and consideration while designing cloud load balancing algorithms which are affected by cloud characteristics. The challenges are in the following points.

A. Geographically Distributed Cloud Nodes
A load balancing algorithm in cloud environment should take into account the geographically distribution of computing nodes for having an efficient performance. Some load balancing algorithms are designed for closely located nodes and therefore they have no assumption about factors such as communication delays, network bandwidth in LANS and WANs, distance between clients and computing nodes and so on [25]. Therefore, they do not work efficiently in cloud computing systems and can not satisfy the system requirements as a suitable load balancer for cloud environment. Then, for designing a cloud load balancer the spatial distribution of computing nodes must be taken into account.

B. Virtual Machines Migration
By using virtualization technique in cloud computing, a physical server can contain several virtual machines that work as independent computing nodes. A common way to unload an overloaded physical server is virtual machine migration among load balancing approaches. But there are many considerations and questions related to this migration that should be answered. During this migration we should answer to these questions [31]: Can we guarantee the VM security when moving a virtual machine to another new location?
Can new resources (network bandwidth, computing resources…) satisfy the user requirements according to the SLA?
How can we distribute the workload dynamically during the VM migration for avoiding bottlenecks in cloud?
Therefore there are many questions and considerations that must be considered while designing a load balancer in cloud which uses VM migration technique.

C. Heterogeneous Nodes and Self-Regulating
In the past researches of load balancing, the researchers have made an assumption about homogenous nodes during a load balancing designing phase [59]. This is obviously not true in cloud computing systems where providing an on-demand access to resources or services dynamically is a necessity and is a fundamental feature of a system. Therefore, there is a necessity to have a mechanism for finding and selecting a new instance with the same configuration as previous allocated resources to transfer the rest of client tasks and requests to new resources when the system needs to a load balancing process because of a sudden increasing of the input workload. For instance, in the Amazon EC2, dynamic load balancing is done by replicating instances of the specific middleware platform. A traffic analyzer tracks a client requests and new instances of the same platform will start when the load increases to a certain threshold [59]. Thus, in these types of solutions a combination of rules is needed for determining the conditions for load balancer. As the number of requests and active resources increase in size and complexity in cloud environment, the handling of these rules is not an easy task. In addition, these rules are static inherently and usually there is no provisioning for refinement or analysis of them [59].
Consequence of this, a load balancing mechanism should be able to self-regulates the system's workload among all cloud's computing resources according to the tasks' or clients' requirements.

D. Storage and Replication Management
Development of cloud technology has solved the problem of traditional data storage methods which require high cost of hardware and personnel management through a resource-integrated heterogeneous system that can provide the best storage, the optimal performance and the load balancing [60].
Stored data across the network have increased exponentially in the last decade for companies and individuals [31]. In this kind of situation, a full replication algorithm does not have the efficient storage utilization because of storing same data in all replication nodes in cloud computing systems. Partial replication methods can be suitable solutions for cloud-based systems which store parts of data sets in each node according to each node's computing resources like processing power and capacity [25]. But using this approach will increase the complexity of load balancing mechanisms that should be aware of availability of data sets' parts across the different computing nodes. In addition, distributing the data to the cloud for optimum data storage usage and also maintaining fast accessibility are some other related issues [25,31]. Therefore, an efficient cloud load balancing algorithm should take into consideration the distribution of applications and their related data sets during load balancing process or VM/application migration according to the partial replication and there should be an inevitable trade-off between partial replication and discussed related concerns.

E. Load Balancer Complexity
It was concluded that load balancing algorithms which are trying to collect every detailed piece of information about system do not have a better performance considerably in comparison to algorithms which use very little or no information in information strategy phase [29].
Like this, in distributed systems and cloud computing environments, algorithms which are less complex in terms of implementation and operation are preferred and they will not have negative performance issues because of their complexity [25]. Therefore in cloud computing systems that load balancing algorithm has high complexity and requires more information, the load balancing and system's performance will be impressed by higher communication cost and delays and it is not good condition for system's efficiency. As a result of this, we can say that a suitable cloud load balancer should be designed in the simplest possible form.

F. Energy Efficiency
One of the important challenging and complicated issues in cloud computing systems is lowering the energy usage of data centers. Data centers have serious negative effects on both the environment and energy resources. Recent researches showed that large-scale data centers consumed about 1.3% of all electricity use of the world and about 2% of all electricity usage for the United States in 2010 [61]. Using internet services, computing applications and data increasing so fast which cause to have more computing resources for processing. The benefits of adoption of using cloud computing services is the economy of scale and energy saving is a key point that allows a set of global resources will be supported by reduced providers [31].
Data center resources need to be handled in an energy efficient manner therefore, a suitable load balancing algorithm for cloud systems should be able to allocate resources and redistribute the system's workloads not only to satisfy Quality of Service (QoS) which has been agreed in Service Level Agreement (SLA), but also reduce energy consumption and carbon emission [62].

G. Cloud Elasticity and Load Balancer Scalability
An important feature of cloud computing is elasticity [31]. Based on this property in cloud environments that provide the ability of resource scale up and scale down for users quickly, we can say that a load balancing algorithm in distributed systems like cloud should take into consider the system's changes in terms of size, topology,… and therefore it should be scalable, adoptable and flexible enough to allow such changes to be handled easily and also can work efficiently. In this condition, it will be able to balance the workload when computing resources and requests increase [63].

H. Load Balancer Stability and Bottleneck Prevention
As we discussed earlier, because of the dynamic nature of cloud computing systems, dynamic load balancing approaches are better choice but among dynamic load balancing algorithms, distributed dynamic load balancing algorithms are more suitable for distributed systems like cloud [25,29]. Invoking the load balancing process and collecting information of system's node should be designed in a way that avoid having a single point of failure or bottleneck [25]. In addition, it is very important that a dynamic load balancer maintain stability in  Prevents the situation in which nodes spend all their time in passing jobs and applications migration instead of processing and execution.  The workloads of two different computing nodes do not differ by more than a specific percent.  The response time for any sudden increasing of system's workload does not exceed a specific threshold.
Therefore during designing a load balancing algorithm for cloud-based systems, stability and bottleneck prevention are two important features that should be taken into consideration.

IV. SURVEYING OF EXISTING CLOUD LOAD BALANCING APPROACHES
In this section, we present and discuss some solutions and contributions that have been proposed in the scientific journals and conferences for cloud computing load balancing. We classify the load balancing approaches into three categories based on their perspective:  General Algorithm-based approaches Architecturalbased approaches  Artificial intelligence-based approaches

A. General Algorithm-based Load Balancing Approaches in Cloud Computing
The General Algorithm-based load balancing approaches which we call them as "GAL-based" in an abbreviated form in this paper, are those mechanisms which propose a complete algorithm and consider all parts of load balancing algorithm within. In this category, a load balancing mechanism can be implemented or simulated based on proposed algorithm. These approaches usually propose a load balancing solution without taking into consideration special cloud architecture and represented in a general form. In other word, we can say some GAL-based load balancing mechanisms are some classical load balancing methods which are similar to the allocation and scheduling methods in operating system such as: Round-Robin, First Come First Service (FCFS), Minimum Execution Time (MET) and etc. In this section we will give a summary of the current proposed algorithms which are belongs to this category.
 Rich Lee et al. [64] proposed some most known GAL-based load balancing mechanisms and represent a good comparison of their performance with one another. We will consider and list all of them here briefly: Round-Robin: One of the most known and the simplest algorithm for dispatching workloads to servers is roundrobin that usually have good performance in systems with low workload.
Weighted round-robin: This algorithm which is derived from original round-robin has better performance compared to traditional round-robin because it assigns higher weights to servers with higher performance. Therefore, the more capable computing nodes will get more incoming workloads.
Least-connection: This algorithm counts the connections associated with each server dynamically and then based on that number it chooses the least count server and assigns new incoming workloads to the server with least connection.
Weighted least-connection: This algorithm counts the associated connections of server too, but associated new incoming workloads based on a factor that calculated by multiplying sever weight by its connection number.
Shortest expected delay: In this algorithm, the last response time for each server is considered and then the server with the least response time is selected as the next appropriate server.
 Punit Gupta et al. [65] proposed a new load balancing algorithm for better distribution of load and further enhancing the QoS. In this paper, a trust model has been presented which is based on current trust models and it uses initialization time, Machine Instruction Per Second (MIPS) and fault rate parameters to calculate trust value for each data center. In this algorithm, users and data centers are categorized into two groups: trusted and untrusted groups. According to these groups, the overloaded nodes' VMs which belong to trusted or untrusted users can migrate to trusted or untrusted data centers that are under-loaded and suitable for migrating.  Osman Sarood et al. [66] stated that virtualization have some negative effects on HPC application. In the paper, a load balancing algorithm is proposed to achieve load balancing for tightly coupled parallel and HPC application executions in virtualized and cloud computing environments. For balancing the workloads in this proposed algorithm, processing cores is divided into two overheap (overloaded) and underSet (under-loaded) cores. Then the biggest task from most overloaded core will transfer to a suitable under-loaded core. This process is repeated until no overloaded cores are left. This load balancing algorithm is suitable for HPC applications which run iteratively and also there is interference from different VMs on the same node in their executions. In the third level, there are service nodes. Level two which consists of some service mangers is used for dividing tasks to some subtasks and assigning them to appropriate service nodes. Finally, in the first level, there is a request manager which receives the incoming workloads and sends tasks to appropriate nodes. This algorithm uses the agent-based method for gathering required information. The proposed load balancer is represented in two phases which uses the OLB algorithm for assigning tasks to service managers and in the next phase the LBMM is used to assign subtasks to the third level.  Brototi Mandal et al. [68] proposed a load balancing algorithm that it was soft computing based. Stochastic hill climbing is a variant of hill climbing algorithm that is an incomplete approach for solving optimization problems. Because the represented load balancing algorithm is a centralized algorithm and therefore dealing with bottleneck problem, the solving optimization problem have taken into consideration for an efficient distribution of system workload.

B. Architectural-Based Load Balancing Approaches in Cloud Computing
Arch-based approaches are those mechanisms that focus on certain architecture and for achieving a load balancing, propose cloud architectures. In this category, algorithms usually not proposed explicitly and load balancing mechanism is represented through architecture components and the relations among them. Generally speaking, this solution usually is an Architectural-based solution and for catching proposed goals, a special cloud computing architecture should be taken into consideration. Here we survey some of these approaches which are proposed in our research literature.
 Monika Simjanoska et al. [69] proposed an Archbased solution for load balancing in cloud computing. L3B is a centralized Arch-based load balancer which is placed between users and cloud heterogeneous nodes in the cloud infrastructure layer. L3B improves the overall cloud performance, reduces power consumption and customers cost through a mechanism that if the incoming workload exceeds beyond a certain threshold, a suitable VM instance will be initiated. In the other hand, if the workload decreases in compression with a certain threshold an active VM will be switched-off automatically. The proposed architecture consists of two main components: Resource Management Module (RMM) and Packet Management Module (PMM). In this architecture RMM manages the cloud resources and regularly gathers information of the active resource utilization and takes into consideration the customers' requirements. PMM module is the main core of the L3B and when the target VM responses back, PMM forwards the response packet to the client. In this paper PMM and RMM modules are discussed in detailed completely.  GaochaoXu et al. [70] proposed a model for balancing workload in the cloud computing environment. Their solution is represented in an Arch-based which is presented through special cloud architecture. A public cloud is divided into some partitions. Partitioning helps to achieve better load balancing in the large-scale and complex environments. In the proposed solution, cloud has a main controller that communicate with the partitions balancers frequently to refresh the status information and each partition uses a local balancer that selects the best strategy for load balancing.  Rui Wang et al. [71] addressed the load balancing problem in cloud computing through a policy for creating a load balancing algorithm in both physical servers and VMs layers. In [71] a two-level architecture is proposed and based on that, an algorithm with six general steps is designed. First of all, the statuses of nodes workload are taken into consideration by a monitor and will be stored in a database. In the next step, the nodes workload is determined according to two upper and lower bounds. Next, based on the workload changes, the future probabilistic changes will be predicated. Finally based on the gathered and evaluated information an application or a VM will be selected and application/VM migration will be started.  Wenhong Tian et al. [72] proposed a load balancing reference architecture for load balancing and scheduling algorithm. In this paper an algorithm which is called DAIRS is presented which balances the workload in cloud computing data centers by using of three parameters: CPU, memory and network bandwidth. The proposed load balancing algorithm is considered for both physical and virtual machines. In the algorithm some parameters such as, average CPU utilization, integrated load imbalance and integrated load balance are used. In addition, four queues such as: waiting queue, requesting queue, optimizing queue and deleting queue are used in DAIRS flowchart.  Fei Ma et al. [73] represented a model for distributed load balancing allocation of virtual machine in a cloud data center using the TOPSIS method. This method is one of the most efficient Multi Criteria Decision Making (MCDM) techniques. This paper which proposing a special architecture for balancing the load, represents a load balancing model. According to the proposed architecture, each node in a data center runs a module of the VM monitor that observes the local resource utilization. If the monitor observation reports an anomaly that resources are overloaded or under-loaded, two decisions can be made. For reducing the number of probabilistic VM migrations, all VMs will be sorted on the problematic PM in decreasing order of current utilization and then the highest utilization will be selected to migrate to a new suitable PM. In this paper, the TOPSIS method is used for selecting the suitable PM.

C. Artificial Intelligence-based Load Balancing Approaches in Cloud Computing
AI-based load balancing mechanisms are the load balancing solutions that their main ideas are based on the Artificial Intelligence concepts. In the other word, AIbased approaches propose a solution for balancing the workloads in cloud computing environments through known artificial intelligence algorithms and methods by finding some similarity between them and cloud computing components and concepts. AI-based load balancing approaches can be proposed in an Arch-based form. Here we will introduce and consider some current AI-based load balancing mechanisms for cloud computing environments.
 Kumar Nishant et al. [75] proposed a modified version of Ant Colony Optimization (ACO). ACO is applied for cloud computing load balancing to help system for a proper functioning even at the peak usage hours. This AI-based solution has a head node which generates ants. Ants traverse the width and length of the cloud network in the way that they know about the location of under-loaded or overloaded nodes. These ants along with their movements update a pheromone table for keeping the resource utilization information. In addition, movements of ants are proposed in two ways like the original ACO:

1) Forward movement 2) Backward movement
Based on the above movements and by using the pheromone table, the loads will be transferred from overloaded nodes to under-loaded ones.
 Seyed Mohssen Ghafari et al. [76] represented a new power aware load balancing mechanism, named Bee-MMT for decreasing power consumption in cloud computing environments. This approach uses the artificial bee colony algorithm with the feature of minimal migration time. For finding over-loaded hosts the BCA is used. Then through MMT-VM selection, some VMs will be selected for migrating to a new host. In addition by using this method, after finding some underloaded hosts, if it is possible, algorithm tries to migrate all VMs which allocated to these hosts to the other hosts while keep them not over-loaded and when all the migration have been completed, switch host to the sleep mode. Proposed algorithm includes four phases:  1) Host over-loading detection 2) VM selecting policy 3) Host under-loading detection 4) SLA violation metrics  Jing Yao et al. [77] proposed an improved ABC by replacing and changing types of requests. In this paper, the similarities between ABC algorithm and cloud computing systems are discussed and because of that it is stated that this AI-based approach can be a suitable solution for solving cloud load balancing problem. The main difference of this improved ABC and original ABC is that in the proposed method, when the queue length of a physical server exceeds beyond a certain threshold, it prevents new entrants with the some type of current requests.
Here we provide a detailed investigation and analysis of reviewed load balancing mechanisms. We survey all of them one by one completely and study their objectives, main ideas, pros and cons. Table 1 gives brief information of this study.
In addition, for a load balancing algorithm some features and consideration should be taken into consideration as we mentioned earlier. Some various parameters are proposed and defined in [78] such as response time, scalability, throughput, resource utilization, fault tolerance, migration time and etc. We survey some of them and some other challenges and considerations which were mentioned earlier in section 3, for the surveyed load balancing algorithms here. The table 4 shows the results of this study.
In this table we categorized some current load balancing mechanism for cloud computing environments that are proposed in scientific journals and conferences in recent years. As mentioned earlier, according to our classification these solutions are classified into three GAL-based, Arch-based and AI-based load balancing mechanisms. We considered all these methods from different aspects. The first point is related to dynamic or static classifications. Because all surveyed load balancing methods have been proposed for cloud computing environments. Therefore all of them have applied dynamic approach which is suitable for systems like cloud computing that have dynamic, unpredictable and various workloads. In addition, most of the proposed load As another metric for evaluating proposed cloud load balancing approaches we referred to algorithm complexity problem in section 3. In table 4, we cover this aspect through an overhead parameter. We describe the proposed load balancing algorithm by three qualitative statements: low, medium and high which are indicating the overhead level for implementing the proposed solution.
Quality of service has special place in cloud services in related discussions. Cloud computing systems offer their services based on pay-as-you-go cost model. Therefore, providing the proposed quality in SLA for customers correctly is very important. As one of the main goals of cloud load balancers, QoS should be taken into account for offering the best suitable required quality of services during balancing the system workload and assigning the jobs to resources. The results of our study in table 4 show that most load balancing mechanisms that have taken into account the SLA violation metrics as one of the evaluation metrics have been considered the QoS problem during their load balancing processes.
One of the other important considerations is energy efficiency and energy consumption problem in cloud computing. In table 4 we determined that which load balancing mechanisms have taken into account this point while they offer their load balancers. The trend of recent researches shows that the energy efficiency becomes an important consideration during designing load balancing mechanisms for cloud computing in recent years.
A common solution in almost all cloud load balancing mechanisms is application or VM migration that some jobs will be transferred from overloaded nodes to underloaded ones for gaining a normal state in the system. In this situation, the migration time can be counted as one of the main factors for evaluating load balancing approaches in cloud systems. Therefore, those solutions that have considered the time migration in their load balancers and using some mechanisms for reducing the migration time and therefore reducing the service response time can be more successful than other approaches those using migration techniques without considering the migration time. In table 4 we determined those solutions that used migration time factor in their load balancers.
Finally we surveyed the different evaluation metrics and tools which have been used for evaluating these proposed load balancers. Simulation is a very good and reasonable way for evaluating proposed mechanisms by simulating the real world conditions and situations. Most  [79] and CloudAnalyst [80] which are popular and common cloud computing environments simulator as we mentioned in table 4.

V. CONCLUSION AND FUTURE WORKS
Load balancing in cloud computing data centers has been a main challenge and an active area of research in recent years. In this paper we have presented a survey on current load balancing techniques and solutions which have proposed only for cloud computing environments. According to our study, cloud load balancing mechanism can be categorized into three main groups based on their designing perspectives: General Algorithm-based, Architectural-based and Artificial Intelligence-based load balancing approaches. In addition, our survey on the current proposed cloud load balancing approaches has some contributions which we list the main ones here: 1) A new Classification of cloud load balancing in cloud computing environment based on the designing perspective has been proposed in this paper. 2) According to our study results the best load blanking approaches in cloud computing are those ones which have dynamic, distributed and noncooperative features. Dynamic feature is referred to dynamic and on demand property in cloud which is resulted in dynamic workload and services. Distributed designing can prevent the bottleneck and a single point of failure and therefore provides the better scalability and fault tolerant abilities. Finally non-cooperative approach can avoid unnecessary overheads while a load balancer is performing. 3) There are many architectural and designing time considerations for implementing a cloud load balancer that should be taken into account such as: virtual machine migration, elasticity, cost and energy consumption management which we proposed a complete discussion in section 3. 4) The result of this study in table 2 shows that the most of the proposed load balancing solutions are suffering from the bottleneck and single point of failure problems in the first place. 5) The recent cloud load balancing solutions are focusing on Green cloud topic in load balancing mechanisms by considering the challenges like: Reducing the energy and power consumption, Reducing carbon emission and also reducing cost customers as a result of energy efficiency topic.
As the future work of this paper, we will consider more cloud load balancing solutions according to our three levels classification and survey the load balancing solutions' trend.
In addition it will be possible to evaluate the current load balancing mechanisms through simulating and taking into consideration more metrics for their evaluations.